Python 多处理和导入模块

aka*_*kin 6 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()
Run Code Online (Sandbox Code Playgroud)

似乎每个进程都有自己的模块 foo 实例,bar()将值更改为 True,但实际上baz()是 False。有什么解决办法吗?

unu*_*tbu 5

与线程不同,单独的进程不共享内存。然而,有一些方法可以在不同的进程之间共享数据。一种方法是使用mp.Value:

foo.py:

import multiprocessing as mp
a = mp.Value('b', False)
Run Code Online (Sandbox Code Playgroud)

然后是脚本

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()
Run Code Online (Sandbox Code Playgroud)

产量

0
0
0
...
1
1
1
...
Run Code Online (Sandbox Code Playgroud)

对于共享布尔值, anmp.Event可能是更好的选择:

foo.py:

import multiprocessing as mp
a = mp.Event()
Run Code Online (Sandbox Code Playgroud)

脚本.py:

def bar():
    foo.a.set()

def baz():
    for i in range(10**5):
        print foo.a.is_set()
Run Code Online (Sandbox Code Playgroud)

产量

False
False
False
...
True
True
True
... 
Run Code Online (Sandbox Code Playgroud)