我试图在两个独立的进程中同时运行两个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 :(得分: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
,即类对象的地址空间。