<p>由于要共享的变量为只读且为“简单”整数,因此只需在全局范围内声明它,使多处理池中的子进程可以看到它:</p>
<pre class="lang-py prettyprint-override"><code>import multiprocessing
GlobalVar = 6
def f(x):
return x**GlobalVar
if __name__ == '__main__':
pool = multiprocessing.Pool()
res= pool.map(f,[1,2,3,4])
print(res)
</code></pre>
<p>印刷品:</p>
<pre><code>[1, 64, 729, 4096]
</code></pre>
<p><strong>讨论</strong></p>
<p>在讨论Python和多处理时,您在哪个平台上运行总是相关的,我已经更新了您的标记以添加<code>Windows</code>(尽管现在编写的代码也可以在Linux上运行)</p>
<p>在创建新进程(或创建进程池时的进程)的Windows上,使用<code>spawn</code>。这意味着新进程不会继承主进程建立的变量,而是为每个新进程启动一个新的Python解释器,并从程序顶部开始执行。这就是为什么必须将启动新进程的代码封装在<code>if __name__ == '__main__':</code>块中,否则将进入递归循环。但是由于这个原因,您必须将<code>GlobalVar</code>的声明移动到全局范围,否则将不会为新创建的进程定义该变量</p>
<p>为池中的每个子进程初始化全局变量的另一种方法是使用池初始值设定项函数,它使您能够执行比这更详细的操作:</p>
<pre class="lang-py prettyprint-override"><code>import multiprocessing
def init_pool(the_int):
global GlobalVar
GlobalVar = the_int
def f(x):
return x**GlobalVar
if __name__ == '__main__':
GlobalVar = 6
pool = multiprocessing.Pool(initializer=init_pool, initargs=(GlobalVar,))
res= pool.map(f,[1,2,3,4])
print(res)
</code></pre>