<p><code>Pool.map</code>在需要对iterable的所有元素并行运行特定函数并阻塞直到整个iterable被处理时非常有用。在您的例子中,您只是在iterable中传递一个项,所以您只是在子进程中运行一个函数,并阻塞直到它完成。这比只在父进程中运行函数要慢,因为这样会增加IPC的开销。你知道吗</p>
<p>如果您的目标是只使用一组参数并行运行<code>tempx</code>和<code>tempy</code>,那么<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.apply_async" rel="nofollow">^{<cd4>}</a>是一个更好的选择:</p>
<pre><code>import multiprocessing
def tempx(the_time):
return int(the_time)*int(the_time)
def tempy(the_time, foobar):
return int(the_time)/(float(foobar))+100
def mp_handler():
p = multiprocessing.Pool(2)
foox = p.apply_async(tempx, args=('2',))
fooy = p.apply_async(tempy, args=('100', '100000'))
print foox.get()
print fooy.get()
if __name__ == '__main__':
mp_handler()
</code></pre>
<p><code>apply_async</code>是非阻塞的;它立即返回一个<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.AsyncResult" rel="nofollow">^{<cd6>}</a>对象,您可以稍后使用它通过调用<code>AsyncResult.get</code>来实际获取异步操作的结果。因此,我们只需在两个函数上调用<code>apply_async</code>,在后台启动它们,然后在每个<code>AsyncResult</code>上调用<code>get()</code>,等待它们完成。你知道吗</p>
<p>这里还需要注意一点:在您的示例中,您在子进程中所做的工作非常简单—两个函数都不需要很长时间就可以完成。相比之下,生成后台进程并通过IPC将函数及其参数传递给这些后台进程,然后将结果发送回来的成本很高。您可能会发现使用<code>multiprocessing</code>比在父进程中按顺序执行这些函数要慢。为了使<code>multiprocessing</code>值得使用,您需要在<code>tempx</code>和<code>tempy</code>内部进行更昂贵的计算。你知道吗</p>