<p>{{{cd2}实际上,每个<cd2}的实例都是活动的。在</p>
<h3><code>multiprocessing</code>与<code>multiprocessing.dummy</code></h3>
<p>只有继续使用<code>multiprocessing.dummy</code>模块,它只是<code>threading</code>模块的包装器,程序才会工作。您仍然在使用“python线程”(而不是单独的进程)Python线程“共享相同的全局状态”,“进程”不共享。Python线程也共享相同的GIL,因此它们仍然限于一次运行一个Python字节码语句,而进程则可以同时运行Python代码。在</p>
<p>如果要将导入更改为<code>from multiprocessing import Pool</code>,您会注意到在所有worker完成执行之后,<code>allOutputs</code>数组保持不变(而且,您可能会收到一个错误,因为您要在全局范围内创建池,您可能应该将其放在<code>main()</code>函数中)。这是因为<code>multiprocessing</code>在生成新进程时会生成整个全局状态的新副本。当worker修改全局<code>allOutputs</code>时,它将修改该初始全局状态的<em>副本</em>。当进程结束时,不会向主进程返回任何内容,并且主进程的全局状态将保持不变。在</p>
<h3>进程间共享状态</h3>
<p>与线程不同,进程不共享相同的内存</p>
<p>如果要在进程之间共享状态,则必须显式声明共享变量并将它们传递给每个进程,或者使用管道或其他方法允许工作进程彼此通信或与主进程通信。在</p>
<p>有几种方法可以做到这一点,但最简单的方法可能是使用<code>Manager</code>类</p>
<pre><code>import multiprocessing
def worker(args):
index, array = args
a = SomeKindOfClass()
a.some_expensive_function()
array[index] = a.output
def main():
n = 8
manager = multiprocessing.Manager()
array = manager.list([0] * n)
pool = multiprocessing.Pool(4)
pool.map(worker, [(i, array) for i in range(n)])
print array
</code></pre>