2017-05-04 620 views
0

我试图在两个独立的进程中同时运行两个while循环,其中第一个修改全局变量,其他进程根据该变量进行决策。在两个进程之间共享全局变量

我的问题是,全局变量在第一个过程完成之前没有修改,所以第二个过程没有正确响应它。

这是我的代码:

flag = [False] 
def loop1(): 
    x = 0 
    while (x<10): 
    x = x + 1 
    read = input("Enter 0 or 1") 
    if read == 0: 
     flag[0] = False 
    else: 
     flag[0] = True 
def loop2(): 
    z = 0 
    while (z<100): 
    z = z + 1 
    if flag[0] == False: 
     # do something 
    else: 
     # do other thing 
    time.sleep(1) 
if __name__ == '__main__': 
    Process(target = loop1).start() 
    Process(target = loop2).start() 
+0

https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes –

回答

1

进程不共享状态。您将需要使用类似multiprocessing.Queue的共享队列,将队列对象作为参数提供给两个进程,并通过队列传递标志变量。

或者使用threading而不是multiprocessing和共享进程的地址空间并可以使用相同(引用到)变量的线程。

这两种方法都有优点和缺点,在SO上进行线程与多处理搜索以供参考。

在线程的情况下,该标志对象将需要在一个类被绑定到包含所有产生的线程是使用它的物体,例如:

from __future__ import print_function 
from threading import Thread 
import time 


class State(object): 

    def __init__(self): 
     self.flag = False 
     self.consumer_thread = Thread(target=self.check_flag) 
     self.consumer_thread.daemon = True 
     self.consumer_thread.start() 

    def read_input(self): 
     while True: 
      _read = input() 
      if _read == 0: 
       self.flag = False 
      else: 
       self.flag = True 
      time.sleep(1) 

    def check_flag(self): 
     while True: 
      if self.flag is True: 
       print("Is true") 
       # do stuff 
      time.sleep(1) 

if __name__ == "__main__": 
    state = State() 
    state.read_input() 

两个线程(主线程+消费者线程)引用同一个对象,self.flag并共享self,即类对象的地址空间。

+0

为什么不''multiprocessing.Value'?我应该提到,只要程序不受CPU限制,则优先使用线程(实施方式)。但是,当CPU受限时,则必须使用进程而不是线程。 –

+0

可以使用它,但必须从整数转换为布尔值 - “值”不采用布尔类型。这是一个过度简化,这取决于。如果线程中运行的是_not_ python代码,即本机扩展或带有本机代码的第三方库,那么线程总是首选,CPU绑定或否。多个进程允许CPU绑定的Python代码并行运行,因为每个进程都有自己的GIL。 – danny

相关问题