在两个进程之间共享全局变量

时间:2017-05-04 14:01:52

标签: python multiprocessing

我试图在两个独立的进程中同时运行两个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()

1 个答案:

答案 0 :(得分:1)

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

或者使用threading代替multiprocessing和共享进程地址空间的线程,并且可以使用相同(引用a)变量。

两种方法都有利弊,在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,即类对象的地址空间。