<p>答案取决于版本和情况。Python最新版本(自3.3以来)的最一般的答案首先在下面由<a href="https://stackoverflow.com/a/5443941/577088">J.F. Sebastian</a>描述。<sup>1</sup>它使用<a href="http://docs.python.org/dev/library/multiprocessing.html#multiprocessing.pool.Pool.starmap" rel="noreferrer">^{<cd1>}</a>方法,该方法接受一系列参数元组。然后,它会自动从每个元组中解包参数并将它们传递给给定的函数:</p>
<pre><code>import multiprocessing
from itertools import product
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with multiprocessing.Pool(processes=3) as pool:
results = pool.starmap(merge_names, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
</code></pre>
<p>对于早期版本的Python,需要编写一个helper函数来显式地解压参数。如果要使用<code>with</code>,还需要编写一个包装器来将<code>Pool</code>转换为上下文管理器。(感谢<a href="https://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments/5442981?noredirect=1#comment80290057_5442981">muon</a>指出这一点。)</p>
<pre><code>import multiprocessing
from itertools import product
from contextlib import contextmanager
def merge_names(a, b):
return '{} & {}'.format(a, b)
def merge_names_unpack(args):
return merge_names(*args)
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(merge_names_unpack, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
</code></pre>
<p>在更简单的情况下,使用固定的第二个参数,也可以使用<code>partial</code>,但只能在Python 2.7+中使用。</p>
<pre><code>import multiprocessing
from functools import partial
from contextlib import contextmanager
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(partial(merge_names, b='Sons'), names)
print(results)
# Output: ['Brown & Sons', 'Wilson & Sons', 'Bartlett & Sons', ...
</code></pre>
<p><sup>1。这其中很大一部分是受到他的答案的启发,而他的答案很可能应该被接受。不过,由于这本书一直排在第一位,因此最好能为将来的读者改进它。</sup></p>