<p>当所有的进程都使用<cdm>共享空间时,{cdm>不会共享所有的进程。这意味着,要在进程之间共享的任何内容都必须经过进程之间的显式连接,例如<code>Queue</code>。在</p>
<p>如果您想要合并所有进程的结果,实际上您可以使用一个结果队列—多个进程(和多个线程)一次访问它们非常安全。然后,您的所有工作人员都可以将结果插入该队列,主进程可以在它们进入时读取它们。在</p>
<p>以下是修改后的代码以使用单个队列:</p>
<pre><code>#!/usr/bin/python3.2
import time
from multiprocessing import Process, Queue
def myWait(processNb, wait, results):
startedAt = time.strftime("%H:%M:%S", time.localtime())
time.sleep(wait)
endedAt = time.strftime("%H:%M:%S", time.localtime())
results.put('Process %s started at %s wait %s ended at %s' % (processNb, startedAt, wait, endedAt))
# queue initialisation
results = Queue()
# process creation arg: (process number, sleep time, queue)
proc = [
Process(target=myWait, args=(0, 2, results,)),
Process(target=myWait, args=(1, 1, results,))
]
# starting processes
for p in proc:
p.start()
for p in proc:
p.join()
# print results
print(results.get())
print(results.get())
</code></pre>
<p>如果您想在不必读取字符串的情况下标识每个结果来自哪个进程,则可以轻松地将其添加为一个2元组。这将更改代码如下(我只显示了更改的部分):</p>
^{pr2}$
<p>这有帮助吗?在</p>
<p>编辑:正如另一个响应者非常正确地指出的那样,传递更多的结构化数据可能比传递字符串更好,但是为了便于解释,我试图保持我的示例与您的示例相似。事实上,为了使将来的更改更容易,我将使用一些可以按名称索引的东西,而不是元组(因此,您不必仅限于在末尾添加项)。在</p>
<p>您可以使用自己的类,也可以使用一个<a href="http://docs.python.org/3.2/library/collections.html#collections.namedtuple" rel="nofollow">collections.namedtuple</a>来完成这项工作(如果您希望以后扩展已经使用元组来代替名称的代码,允许逐步迁移,则后者特别有用)。在</p>
<p>请记住(据我所知),您可以通过队列传递任何可以<a href="http://docs.python.org/3.2/library/pickle.html" rel="nofollow">pickled</a>的内容。在</p>