2017-10-20 138 views
1

我試圖模擬Python 3多處理中的生產者 - 消費者設計。主要的問題是生產者開始,但消費者直到生產者結束纔開始(在這種情況下,消費者不會開始,因爲生產者永遠不會結束)。開始在同一時間進程python3

下面是代碼:

#!/usr/bin/python3 

from scapy.all import * 
from queue import Queue 
from multiprocessing import Process 

queue = Queue() 

class Producer(Process): 
    def run(self): 
     global queue 
     print("Starting producer thread") 
     sniff(iface="wlan1mon", store=0, prn=pkt_callback) 

def pkt_callback(pkt): 
    queue.put(pkt) 
    print(queue.qsize()) 

class Consumer(Process): 
    def run(self): 
     global queue 
     while True: 
      pkt = queue.get() 
      queue.task_done() 
      if pkt.haslayer(Dot11): 
       print("**Packet with Dot11 layer has been processed") 
      else: 
       print("--Packet without Dot11 layer has been processed") 



if __name__ == '__main__': 
    Producer().start() 
    Consumer().start() 

我不知道什麼是錯在我的代碼。我測試它使用多線程,它的工作原理,所以我想有一些我誤解了多處理。

謝謝。

回答

1

我不確定你的隊列是一個共享內存對象。我認爲你的製作人正在寫內存隊列,你的消費者正在從隊列中讀取內存中的內容,但他們不是同一個內存,所以他們不會互相交談。我想你需要一個「經理人」包裹它。看文檔。 https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

或者使用Queue的多處理版本。再次來自文檔:https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

+0

你說得對,這兩個進程沒有共享內存。我只是改變它,現在我使用隊列的多處理版本,它的工作原理。但現在我發現了另一個問題 - 謝謝@RobertB 回溯(最近一次調用最後一次): 文件「/usr/lib/python3.5/multiprocessing/queues.py」,第234行,在_feed obj = ForkingPickler .dumps(obj) 轉儲中的文件「/usr/lib/python3.5/multiprocessing/reduction.py」,第50行 cls(buf,protocol).dump(obj) _pickle.PicklingError:Can not pickle at 0x7f41facf29d8>:屬性查找RadioTap。 on scapy.layers.dot11失敗 – Elena

+0

也許爲新問題開始一個新問題。很難閱讀評論。我猜測你的隊列所期望的和你的回調中嗅探返回的數據類型不匹配。我猜測sniff正在返回一個對象,然後multiprocessing.Queue對象正在嘗試將其醃製並將其發送到其他進程。酸洗失敗,因爲醃菜不喜歡嗅聞物體。酸洗是一種序列化。隊列對象要求輸入是「pickleable」(每個文檔)。 – RobertB

+0

...你可以改變sniff來返回pickleable,或者你必須預先/後處理對象到*是* pickleable的東西。我不熟悉scapy,所以我不能說。 – RobertB

相關問題