2017-07-13 6 views
-2

J'ai du mal à comprendre comment le code suivant fonctionne:Utilisation de la file d'attente pour les boucles (Python)

from multiprocessing import Process, Queue 
import os, time, random 


def write(q): 
    for value in ['A', 'B', 'C']: 
     print 'Put %s to queue...' % value 
     q.put(value) 
     time.sleep(random.random()) 

def read(q): 
    while True: 
     value = q.get(True) 
     print 'Get %s from queue.' % value 

if __name__=='__main__': 
    q = Queue() 
    pw = Process(target=write, args=(q,)) 
    pr = Process(target=read, args=(q,)) 

    pw.start() 
    pr.start() 
    pw.join() 

    pr.terminate() 

Il semble que pw.join() et synchronise pwpr mais je ne sais pas comment cela fonctionne. Je pensais pr.start() procède après pw.start() est complètement terminé, ce qui signifie Get %s from queue ne pouvait être reçu après trois Put %s to queue... avait été imprimé. J'ai également pensé pool() est utilisé pour multiprocess et process seulement est utilisé pour un seul processus, mais maintenant il semble que je me trompe totalement.

Merci pour toute aide!

+0

'pool' est de créer un groupe de processus. 'Process' crée un seul processus séparé. Les deux sont des constructions multitraitement. –

+1

"Je pensais que' pr.start() 'se produirait après que' pw.start() 'soit complètement terminé" - 'pw.start()' est "complètement fini" une fois qu'il a démarré 'pw'. Il n'attend pas que le processus 'pw' se termine. – user2357112

+0

@ user2357112 Merci, mais quand je supprime pw.join(), je ne peux obtenir aucun message 'Get% s', pouvez-vous me dire quel est le rôle joué par pw.join()? –

Répondre

0

D'abord, votre question devrait avoir droit quelque chose comme « Comment rejoindre en Python »

join() bloque le fil d'appel (qui dans ce cas est le fil conducteur) jusqu'à ce que le processus dont jointure est appelé est terminé. Voir la définition here. Donc, dans votre code, vous bloquez l'appel de pr.terminate() jusqu'à ce que pw finisse. Lorsque vous supprimez l'instruction pw.join, le processus pr se termine peu après le démarrage et c'est la raison pour laquelle vous ne voyez aucun message "Get ...".

+0

Merci! Maintenant, je comprends. –