2012-07-25 4 views
0

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() 

Répondre

1

Il y a une boucle infinie dans votre fonction hello. Vous devez mettre un sentinent comme une dernière valeur dans la file d'attente, vérifiez et sortir de la boucle.

+0

Vous avez raison ... même si 'queue.get' ne bloquait pas, il serait bloqué par la boucle –

+0

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

+0

@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. –

Questions connexes