Je n'arrive pas à comprendre ce qui ne va pas avec le code multitraitement python suivant. Cela ne se termine pas. Toute suggestion serait très appréciée.Problèmes de base avec le multitraitement Python
from multiprocessing import Process, Queue, Lock
def hello(num, myqueue):
while True:
item = myqueue.get()
print 'Thread ', num, 'got', item
return
def put_on_queue(myqueue):
for i in range(10):
myqueue.put(i)
return
if __name__ == '__main__':
processes = []
myqueue = Queue()
for i in range(4):
proc = Process(target = hello, args = (i, myqueue))
proc.start()
processes.append(proc)
put_on_queue(myqueue)
for proc in processes:
proc.join()
-------------- ----------------- EDIT
OK, sur la base des commentaires J'ai reçu, et de l'aide en ligne j'ai révisé mon code comme ci-dessous. Toujours pas de chance :-(
def hello(num, myqueue):
while not exit_flag:
item = myqueue.get(False,5)
print 'Thread ', num, 'got', item
return
def put_on_queue(myqueue):
global exit_flag
for i in range(10):
myqueue.put(i)
while not myqueue.empty():
pass
exit_flag = 1
return
if __name__ == '__main__':
mylock = Lock()
processes = []
myqueue = Queue()
exit_flag = 0
for i in range(4):
proc = Process(target = hello, args = (i, myqueue))
#proc.daemon = True
proc.start()
processes.append(proc)
put_on_queue(myqueue)
for proc in processes:
proc.join()
Vous avez raison ... même si 'queue.get' ne bloquait pas, il serait bloqué par la boucle –
Une fois que vous avez joint tous les processus, le processus fils se termine automatiquement, qu'il soit ou non dans une boucle infinie. Voir la [question] (http://stackoverflow.com/questions/11620431/basic-python-multi-threading-issue) J'ai posté hier – JZee
@JayZee: Je pense que vous avez mal compris cette autre réponse. orm the [documentation] (http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.join) de '.join()': * "Bloquer le thread appelant jusqu'au processus dont la méthode join() est appelé se termine ou jusqu'à ce que le délai facultatif se produise. "* Ainsi, le processus appelant ne peut se terminer que lorsque le processus fils se termine. Mais ils ne le font jamais! Notez que dans votre autre question, la ** file d'attente ** est jointe, pas les autres threads. –