【问题标题】:Python multiprocessing and an imported modulePython 多处理和导入的模块
【发布时间】:2015-08-19 13:01:23
【问题描述】:

我有两个正在运行的进程访问这样的导入模块:

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。有什么解决方法吗?

【问题讨论】:

  • 查找queues 和pipes
  • @muddyfish 只是为了交流,不是吗?
  • 是的,除此之外,您不能更改非线程友好的对象。
  • Process 不是指真正的进程(即具有单独的内存空间)吗?在这种情况下,预计他们有自己的模块实例。你想让我做什么?交流?在文档中,它说明了如何做到这一点(队列、管道和共享内存)。
  • @skyking 并没有真正交流,而是强制他们拥有相同的 foo 实例。或者以某种方式将其作为参数传递

标签: python python-multiprocessing


【解决方案1】:

与线程不同,单独的进程不共享内存。 但是,有一些方法,to share data between separate processes。 一种方法是使用mp.Value

foo.py

import multiprocessing as mp
a = mp.Value('b', False)

然后是脚本

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
...

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

foo.py

import multiprocessing as mp
a = mp.Event()

script.py

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

def baz():
    for i in range(10**5):
        print foo.a.is_set()

产量

False
False
False
...
True
True
True
... 

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2011-04-04
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多