Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理和导入的模块_Python_Python Multiprocessing - Fatal编程技术网

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实例。或者以某种方式把它当作一个论点