나는 파이썬 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 : 피클을 사용할 수 없습니다. at 0x7f41facf29d8> : 속성 조회 RadioTap. scapy.layers.dot11의 에 실패했습니다. –
Elena
새로운 문제에 대한 새로운 질문을 시작할 수 있습니다. 의견을 읽기가 어렵습니다. 큐가 예상하는 것과 콜백에서 반환하는 스 니프 사이에 데이터 형식이 일치하지 않는다고 생각합니다. 나는 스 니프가 객체를 반환하고 다중 처리를 수행하고있는 것으로 추측하고 있습니다 .Queue 객체는 피클 링을 시도하여 다른 프로세스로 보냅니다. 피클은 냄새 개체를 좋아하지 않으므로 피클 링이 실패합니다. 산세는 일종의 직렬화입니다. 대기열 객체는 입력이 "pickleable"(문서별로)이어야합니다. – RobertB
... 당신은 sniff를 변경하여 pickleable을 반환하거나, pre/post 처리해야만 * 피클 할 수있는 것으로 변환 할 수 있습니다. 나는 scapy에 익숙하지 않기 때문에 나는 말할 수 없다. – RobertB