python - 无法从 Python 进程中返回 append 值

标签 python list process append

我在 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/

相关文章:

list - 两个列表 F# 之间的交集

linux - 当我启动类似 "gedit"的东西时会立即返回提示时会发生什么?

c - 如何为同一个父进程创建 4 个子进程并等待 4 个子进程完成?

python - 从字符串列表中删除字符

python - 字符串中的第一个唯一字符

python - 如何在 python 中进行子排序?

java - 由ProcessBuilder创建的进程不会终止

python - Beautifulsoup - 如何打开图片并下载它们

python - 在 Python 中使用随机模块获取唯一编号

python - 创建一个包含 >255 个元素的列表