<p>如果您希望从<code>multiprocessing</code>获取多个返回值,那么您可以这样做。下面是一个简单的示例,首先是在串行python中,然后是<code>multiprocessing</code>:</p>
<pre><code>>>> a,b = range(10), range(10,0,-1)
>>> import math
>>> map(math.modf, (1.*i/j for i,j in zip(a,b)))
[(0.0, 0.0), (0.1111111111111111, 0.0), (0.25, 0.0), (0.42857142857142855, 0.0), (0.6666666666666666, 0.0), (0.0, 1.0), (0.5, 1.0), (0.3333333333333335, 2.0), (0.0, 4.0), (0.0, 9.0)]
>>>
>>> from multiprocessing import Pool
>>> res = Pool().imap(math.modf, (1.*i/j for i,j in zip(a,b)))
>>> for i,ai in enumerate(a):
... x,y = res.next()
... print("{x},{y} = modf({u}/{d})").format(x=x,y=y,u=ai,d=b[i])
...
0.0,0.0 = modf(0/10)
0.111111111111,0.0 = modf(1/9)
0.25,0.0 = modf(2/8)
0.428571428571,0.0 = modf(3/7)
0.666666666667,0.0 = modf(4/6)
0.0,1.0 = modf(5/5)
0.5,1.0 = modf(6/4)
0.333333333333,2.0 = modf(7/3)
0.0,4.0 = modf(8/2)
0.0,9.0 = modf(9/1)
</code></pre>
<p>因此,要从带有<code>multiprocessing</code>的函数返回多个值,您只需要有一个返回多个值的函数……您只需将这些值作为元组列表返回。在</p>
<p><code>multiprocessing</code>的主要问题是大多数函数没有序列化。所以,如果你真的想做你想做的事情…我强烈建议你使用<code>pathos</code>(如下所述)。使用<code>multiprocessing</code>最大的障碍是作为目标传递的函数必须是可序列化的。您可以对<code>prepare_input_data</code>函数进行一些修改……第一个修改是确保它被封装。如果您的函数没有完全封装(例如,它在自己的作用域之外有名称引用查找),那么它可能不会使用<code>pickle</code>进行pickle。这意味着您需要在目标函数中包含所有导入,并通过函数输入传递任何其他变量。您看到的错误(<code>UnPicklableError</code>)是由于目标函数及其依赖项无法序列化,也不是因为您不能从<code>multiprocessing</code>返回多个值。在</p>
<p>尽管作为一个好的实践,我还是将目标函数封装起来,但它可能有点乏味,并且可能会使代码慢一点。我还建议您将代码转换为使用<code>dill</code>,并且<code>pathos.multiprocessing</code><code>dill</code>是一个高级序列化程序,可以对几乎所有python对象进行pickle,<code>pathos</code>提供了一个使用<code>dill</code>的<code>multiprocessing</code>分叉。这样,您就可以传递<code>pipe</code>(即<code>apply</code>)或{<cd19>}中的大多数python对象,而不必太担心花太多精力重构代码,以确保普通的<code>pickle</code>和{<cd1>}可以处理它。在</p>
<p>另外,我将使用异步<code>map</code>而不是执行上面的操作。<code>pathos.multiprocessing</code>具有在<code>map</code>函数中获取多个参数的能力,因此您不需要像上面所做的那样将它们包装在元组<code>args</code>中。使用异步<code>map</code>时,接口应该更干净,如果需要,可以返回多个参数……只需将它们打包在一个元组中。在</p>
<p>这里有一些例子可以证明我上面所指的。在</p>
<p>返回多个值:</p>
^{pr2}$
<p>异步映射:
<a href="https://stackoverflow.com/questions/28375508/python-multiprocessing-tracking-the-process-of-pool-map-operation/28382913#28382913">Python multiprocessing - tracking the process of pool.map operation</a></p>
<p><code>pathos</code>:
<a href="https://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma/21345273#21345273">Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map()</a></p>
<p><code>pathos</code>:
<a href="https://stackoverflow.com/questions/19984152/what-can-multiprocessing-and-dill-do-together/19985580#19985580">What can multiprocessing and dill do together?</a></p>
<p>我们仍然无法运行您的代码…但如果您发布可以运行的代码,则可能会有助于编辑代码(使用<code>pathos</code>fork和异步<code>map</code>或其他方法)。在</p>
<p>仅供参考:<code>pathos</code>的发行版有点过期(也就是说晚了),所以如果你想试试的话,最好在这里得到代码:<a href="https://github.com/uqfoundation" rel="nofollow noreferrer">https://github.com/uqfoundation</a></p>