2017-10-20 45 views
1

J'essaie de simuler une conception producteur-consommateur en multiprocesseur Python 3. Le problème principal est que le producteur démarre mais que le consommateur ne démarre pas avant la fin du producteur (dans ce scénario, le consommateur ne démarre pas car le producteur ne finit jamais).Démarre en même temps les processus python3

Voici le code:

#!/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() 

Je ne sais pas ce qui ne va pas dans mon code. Je l'ai testé à l'aide du multithreading et cela fonctionne, donc je suppose qu'il y a quelque chose que j'ai mal compris au sujet du multitraitement.

Merci.

Répondre

1

Je ne suis pas sûr que votre file d'attente est un objet de mémoire partagée. Je pense que votre producteur écrit dans une file d'attente dans sa mémoire et que votre consommateur lit une file d'attente dans sa mémoire, mais ils n'ont pas la même mémoire et ne se parlent donc pas. Je pense que vous avez besoin d'un "gestionnaire" enroulé autour de lui. voir les docs. https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

Ou utilisez la version multitraitement d'une file d'attente. Encore une fois à partir des documents: https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

+0

Vous avez raison, les deux processus ne partageaient pas la mémoire. Je viens de le changer et j'utilise maintenant la version multi-traitement de Queue, et ça marche. Mais maintenant, j'ai trouvé un autre problème -.- Merci @RobertB Traceback (appel le plus récent en dernier): Fichier "/usr/lib/python3.5/multiprocessing/queues.py", ligne 234, dans _feed obj = ForkingPickler .dumps (obj) Fichier "/usr/lib/python3.5/multiprocessing/reduction.py", ligne 50, dans les dumps cls (buf, protocole) .dump (obj) _pickle.PicklingError: impossible de décaper à 0x7f41facf29d8>: recherche d'attribut RadioTap. sur scapy.layers.dot11 a échoué – Elena

+0

Peut-être commencer une nouvelle question pour le nouveau problème. Difficile à lire dans un commentaire. Je suppose qu'il existe une incompatibilité de type de données entre ce que votre file d'attente attend et ce que le sniff renvoie dans votre rappel. Je devine que sniff retourne un objet, alors l'objet multiprocessing.Queue essaye de le décaper et de l'envoyer à l'autre processus. Le décapage échoue parce que le cornichon n'aime pas l'objet sniff. Le décapage est un type de sérialisation. – RobertB

+0

... vous pouvez soit changer sniff pour renvoyer quelque chose décollable, ou vous devez pré/post-traiter l'objet dans quelque chose qui est * pickleable. Je ne suis pas familier avec Scapy donc je ne peux pas dire. – RobertB