2017-07-18 1 views
0

J'essaie de définir une variable globale dans un processus et de la lire à partir d'un autre processus. C'est essentiellement ce que je fais:La variable globale a une valeur différente lorsqu'elle est appelée depuis une fonction différente

from multiprocessing import Process 
import time 

rocket = 0 

def func1(): 
    global rocket 
    while rocket < 10: 
     rocket += 1 
     print("Func1: " + str(rocket)) 
     time.sleep(5) 

def func2(): 
    while rocket < 10: 
     print ("Func2: " + str(rocket)) 
     time.sleep(1) 

if __name__=='__main__': 
    p1 = Process(target = func1) 
    p1.start() 
    p2 = Process(target = func2) 
    p2.start() 

Ce que je pense que ce code devrait faire:

  • func1 augmente les « fusées » variable globale de 1 toutes les cinq secondes
  • Chaque seconde Func2 lit les
  • il
  • fusées variables globales et imprime les deux méthodes PARALLÈLES jusqu'à ce que == 'fusées de 10

Ainsi, le résultat attendu devrait être quelque chose comme:

Func1: 1 
Func2: 1 
Func2: 1 
Func2: 1 
Func2: 1 
Func2: 1 
Func1: 2 
Func2: 2 
Func2: 2 
#... and so on 

Mais la sortie réelle va comme:

Func1: 1 
Func2: 0 
Func2: 0 
Func2: 0 
Func2: 0 
Func2: 0 
Func1: 2 
Func2: 0 
Func2: 0 
#... and so on 

Lors de l'impression des 'fusées' Func2 reste toujours 0

Je déclare ' fusées 'comme variable globale dans func1 as you should

Que manque-t-il ici?

+0

double possible de [Python multitraitement mises à jour des variables globales ne est pas renvoyé] (https: //stackoverflow.com/questions/11055303/python-multiprocessing-global-variable-updates-not-returned-to-parent) –

Répondre

0

Vous pouvez essayer de mettre la fusée globale = 0 et supprimer la ligne rocket = 0

0

Je l'ai finalement obtenu!

Vous ne pouvez pas utiliser les variables globales comme je le souhaitais. A la place, vous utilisez une file d'attente pour échanger des données entre les processus.

The docu has an example on this.

Alors vous pouvez faire quelque chose comme ceci:

from multiprocessing import Process, Queue 
import time 

def func1(q): 
    q.put("FirstValue") 
    time.sleep(10) 
    q.put("SecondValue") 


def func2(q): 
    time.sleep(5) 
    print ("Func2: " + str(q.get())) 
    time.sleep(15) 
    print ("Func2: " + str(q.get())) 


if __name__=='__main__': 
    q = Queue() 

    p1 = Process(target = func1, args=(q,)) 
    p1.start() 
    p2 = Process(target = func2, args=(q,)) 
    p2.start() 

qui imprime:

Func2: FirstValue 
Func2: SecondValue