Python多处理和导入的模块
我有两个正在运行的进程可以访问这样的导入模块:Python多处理和导入的模块,python,python-multiprocessing,Python,Python Multiprocessing,我有两个正在运行的进程可以访问这样的导入模块: import foo def bar(): while True: foo.a = True def baz(): while True: print foo.a p1 = Process(target=bar) p2 = Process(target=baz) p1.start() p2.start() 似乎每个进程都有自己的模块foo实例,bar()将值更改为True,但在baz()中为False。任何解决方法?
import foo
def bar():
while True:
foo.a = True
def baz():
while True:
print foo.a
p1 = Process(target=bar)
p2 = Process(target=baz)
p1.start()
p2.start()
似乎每个进程都有自己的模块foo实例,
bar()
将值更改为True,但在baz()
中为False。任何解决方法?与线程不同,单独的进程不共享内存。
然而,也有办法。
一种方法是使用mp.Value
:
foo.py:
import multiprocessing as mp
a = mp.Value('b', False)
import multiprocessing as mp
a = mp.Event()
def bar():
foo.a.set()
def baz():
for i in range(10**5):
print foo.a.is_set()
然后是剧本
import time
import foo
import multiprocessing as mp
def bar():
foo.a.value = True
def baz():
for i in range(10**5):
print foo.a.value
if __name__ == '__main__':
p2 = mp.Process(target=baz)
p2.start()
time.sleep(0.5)
p1 = mp.Process(target=bar)
p1.start()
屈服
0
0
0
...
1
1
1
...
False
False
False
...
True
True
True
...
对于共享布尔值,
mp.Event
可能是更好的选择:
foo.py:
import multiprocessing as mp
a = mp.Value('b', False)
import multiprocessing as mp
a = mp.Event()
def bar():
foo.a.set()
def baz():
for i in range(10**5):
print foo.a.is_set()
script.py:
import multiprocessing as mp
a = mp.Value('b', False)
import multiprocessing as mp
a = mp.Event()
def bar():
foo.a.set()
def baz():
for i in range(10**5):
print foo.a.is_set()
屈服
0
0
0
...
1
1
1
...
False
False
False
...
True
True
True
...
查找
队列
s和管道
s@muddyfish这只是为了交流,不是吗?是的,除此之外,你不能更改线程不友好的对象。Process
难道不意味着一个真正的进程(即具有单独的内存空间)?在这种情况下,他们应该有自己的模块实例。你想做什么?沟通?在文档中,它说明了如何做到这一点(队列、管道和共享内存)。@skyking不是真正的通信,而是强制他们使用相同的foo实例。或者以某种方式把它当作一个论点