我在 Ubuntu 8.10 上运行 Python 2.6.5。
对于我正在处理的项目,我需要同时运行多个进程并将每个进程的输出保存到各自的列表中。由于我无法直接从进程返回输出值,因此我将输出列表作为参数传递给我的目标函数,并将输出 append 到该列表。问题是,当我在运行进程后尝试访问该列表时,该列表仍然是空的。下面是我遇到的问题的简化版本以及错误消息。
代码:
from multiprocessing import Process
import sys, math, os,commands
outputs = []
def calculate(a,b,outputs):
c = a*b
outputs.append(c)
#return c
outputs1 = []
p1 = Process(target = calculate, args = (2,3,outputs1))
p1.start()
p1.join()
print 'len(outputs1) = ' + str(len(outputs1))
print 'outputs1 = ' + str(outputs1[0])
错误:
len(outputs1) = 0
Traceback (most recent call last):
File "append_test.py", line 23, in <module>
print 'outputs1 = ' + str(outputs1[0])
IndexError: list index out of range
我试图让每个进程完全独立于其他进程,以免损坏数据。我已经研究过尝试使用多处理中的数组模块,但 append 似乎特定于列表。当我使用线程而不是进程运行完全相同的代码时,我毫无问题地获得了所需的输出,这使我相信这是内存共享的问题。
最佳答案
当您使用单独的进程时,每个进程都会获得内存中所有内容的自己的副本。这就是父进程在其输出
中看不到任何内容的原因:每个子进程都 append 到其自己的输出
副本。
您需要使用某种形式的进程间通信。 Python 的 multiprocessing
库为此提供了两个功能:pipes and queues .
例如,使用队列
:
>>> from multiprocessing import Process, Queue
>>> def f(q): q.put("hello from the child process")
...
>>> q = Queue()
>>> p = Process(target=f, args=(q,))
>>> p.start()
>>> p.join()
>>> q.get()
'hello from the child process'
关于python - 无法从 Python 进程中返回 append 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338732/