2个进程是否可以访问同一个列表?

时间:2014-01-15 22:09:32

标签: python python-multithreading

我设计了一个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.

2 个答案:

答案 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上,新流程不是旧流程的分支,它是一个全新的流程。

有很多选择。

最好的做法是重新设计算法,将不可变值传递给子节点并让它返回新的不可变值,而不是改变共享值。

如果你不能走得那么远,你通常可以通过传递消息来重写事物,例如QueuePipe。在最糟糕的情况下,消息可以是(list.append, data, [10, 14, 5]),但通常您可以提出更高级别且更有意义的内容。