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()
我不知道什麼是錯在我的代碼。我測試它使用多線程,它的工作原理,所以我想有一些我誤解了多處理。
謝謝。
你說得對,這兩個進程沒有共享內存。我只是改變它,現在我使用隊列的多處理版本,它的工作原理。但現在我發現了另一個問題 - 謝謝@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
也許爲新問題開始一個新問題。很難閱讀評論。我猜測你的隊列所期望的和你的回調中嗅探返回的數據類型不匹配。我猜測sniff正在返回一個對象,然後multiprocessing.Queue對象正在嘗試將其醃製並將其發送到其他進程。酸洗失敗,因爲醃菜不喜歡嗅聞物體。酸洗是一種序列化。隊列對象要求輸入是「pickleable」(每個文檔)。 – RobertB
...你可以改變sniff來返回pickleable,或者你必須預先/後處理對象到*是* pickleable的東西。我不熟悉scapy,所以我不能說。 – RobertB