Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t从Python进程中返回附加值_Python_List_Process_Append - Fatal编程技术网

Can';t从Python进程中返回附加值

Can';t从Python进程中返回附加值,python,list,process,append,Python,List,Process,Append,我正在Ubuntu 8.10上运行Python 2.6.5 对于我正在处理的项目,我需要同时运行多个流程,并将它们的每个输出保存到各自的列表中。因为我不能直接从进程返回输出值,所以我将输出列表作为参数传递给目标函数,并将输出附加到该列表中。问题是,当我在运行进程后尝试访问该列表时,该列表仍然为空。下面是我遇到的问题的简化版本以及错误消息 代码: 错误: len(outputs1) = 0 Traceback (most recent call last): File "append_test

我正在Ubuntu 8.10上运行Python 2.6.5

对于我正在处理的项目,我需要同时运行多个流程,并将它们的每个输出保存到各自的列表中。因为我不能直接从进程返回输出值,所以我将输出列表作为参数传递给目标函数,并将输出附加到该列表中。问题是,当我在运行进程后尝试访问该列表时,该列表仍然为空。下面是我遇到的问题的简化版本以及错误消息

代码:

错误:

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
len(输出1)=0
回溯(最近一次呼叫最后一次):
文件“append_test.py”,第23行,在
打印“outputs1=”+str(outputs1[0])
索引器:列表索引超出范围

我试图使每个进程完全独立于其他进程,以防损坏数据。我已经研究过如何从多处理中使用数组模块,但是append似乎是特定于列表的。当我使用线程而不是进程运行完全相同的代码时,我会毫无问题地获得所需的输出,这使我相信这是内存共享的问题。

当使用单独的进程时,每个进程都会获得内存中所有内容的自己副本。这就是为什么父进程从未在其
输出中看到任何内容的原因:每个子进程都附加到自己的
输出副本中

您需要使用某种形式的进程间通信。Python的库为此提供了两个特性:

例如,使用
队列

>>> 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'
多处理
模块在线文档中标题为的部分表示它[仅]“支持两种类型的进程间通信通道”,并继续提到队列和管道。值得注意的是,它没有提到
list
对象,如
outputs1
。这是有意义的,因为这两个进程根本不共享内存

我不确定,但我也怀疑您可能需要将创建进程并启动它的代码部分等放在
中,如果uuuu name_uuuu=='\uuuuuuu main:
子句,以防止子进程创建子进程


总之,我认为,为了使用这两种方法中的一种进行进程间通信,您必须重新编写一些东西——对我来说,队列似乎是合乎逻辑的选择。

请修改您的代码格式——对于Python代码来说,查看东西是如何缩进的尤为重要。使用类似AMPQ的方法可以很容易地在服务器之间分配工作机器。您是否考虑过使用
多处理.Queue
s?在
多处理
模块的题为“加入使用队列的进程”的小节中,建议“无论何时使用队列,您都需要确保在加入流程之前,队列上的所有项目最终都将被删除”。我认为这意味着此答案代码中的
q.get()
应该移到
p.join()
之前,就像文档中的示例所示。这一点很好。(不过,文档可能会在管道和队列部分提到这一点。)
>>> 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'