我设计了一个python模块,我想在2个不同的进程中运行2个方法(method1和method2)是否可以拥有一个全局列表,两个进程都可以读取和写入?或者这会在我的项目中导致问题吗?
以下是一个例子:
from multiprocessing import Process, Queue
data =[]
def method1():
global data
data += [10,14,5]
def method2():
global data
data = [1,3,4]
proc = Process(target=method1)
proc.start()
print data
if __name__ == '__main__':
method2()
这需要在Python 2.7中跨平台,windows,linux和OS X.
答案 0 :(得分:1)
来自帮助文档: http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
您已经导入了Queue。现在你只需要使用它:)
从队列中添加项目,获取项目。
答案 1 :(得分:1)
如果这需要跨平台,那么不,你不能共享这样的列表。 (在Unix上,如果你小心,你有时可以,但从不在Windows上。)
如果您在文档中阅读Sharing state between processes,它会解释您可以共享的内容和方式,但基本上,它只是简单的值,Array
的其他可共享类型,以及您可以定义为的任何内容ctypes.Structure
,就是这样。
Programming guidelines,特别是Windows部分,解释了为什么这是真的,以及如何处理它。但基本上,问题是,在Windows上,新流程不是旧流程的分支,它是一个全新的流程。
有很多选择。
最好的做法是重新设计算法,将不可变值传递给子节点并让它返回新的不可变值,而不是改变共享值。
如果你不能走得那么远,你通常可以通过传递消息来重写事物,例如Queue
或Pipe
。在最糟糕的情况下,消息可以是(list.append, data, [10, 14, 5])
,但通常您可以提出更高级别且更有意义的内容。