2017-10-20 7 views
1

나는 파이썬 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

또는 다중 처리 버전의 대기열을 사용하십시오. 다시 docs에서 : 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 : 피클을 사용할 수 없습니다. at 0x7f41facf29d8> : 속성 조회 RadioTap. scapy.layers.dot11의 에 실패했습니다. – Elena

+0

새로운 문제에 대한 새로운 질문을 시작할 수 있습니다. 의견을 읽기가 어렵습니다. 큐가 예상하는 것과 콜백에서 반환하는 스 니프 사이에 데이터 형식이 일치하지 않는다고 생각합니다. 나는 스 니프가 객체를 반환하고 다중 처리를 수행하고있는 것으로 추측하고 있습니다 .Queue 객체는 피클 링을 시도하여 다른 프로세스로 보냅니다. 피클은 냄새 개체를 좋아하지 않으므로 피클 링이 실패합니다. 산세는 일종의 직렬화입니다. 대기열 객체는 입력이 "pickleable"(문서별로)이어야합니다. – RobertB

+0

... 당신은 sniff를 변경하여 pickleable을 반환하거나, pre/post 처리해야만 * 피클 할 수있는 것으로 변환 할 수 있습니다. 나는 scapy에 익숙하지 않기 때문에 나는 말할 수 없다. – RobertB