<p>这里有一个我有时使用的替代方法,它在Python2.x中有效:</p>
<p>您可以创建一个顶级的“别名”,按实例方法排序,该别名接受要在池中运行其实例方法的对象,并让该对象为您调用实例方法:</p>
<pre><code>import functools
import multiprocessing
def _instance_method_alias(obj, arg):
"""
Alias for instance method that allows the method to be called in a
multiprocessing pool
"""
obj.instance_method(arg)
return
class MyClass(object):
"""
Our custom class whose instance methods we want to be able to use in a
multiprocessing pool
"""
def __init__(self):
self.my_string = "From MyClass: {}"
def instance_method(self, arg):
"""
Some arbitrary instance method
"""
print(self.my_string.format(arg))
return
# create an object of MyClass
obj = MyClass()
# use functools.partial to create a new method that always has the
# MyClass object passed as its first argument
_bound_instance_method_alias = functools.partial(_instance_method_alias, obj)
# create our list of things we will use the pool to map
l = [1,2,3]
# create the pool of workers
pool = multiprocessing.Pool()
# call pool.map, passing it the newly created function
pool.map(_bound_instance_method_alias, l)
# cleanup
pool.close()
pool.join()
</code></pre>
<p>此代码生成此输出:</p>
<blockquote>
<p>From MyClass: 1<br/>
From MyClass: 2<br/>
From MyClass: 3 </p>
</blockquote>
<p>一个限制是,不能将其用于修改对象的方法。每个进程都会获得它正在调用其方法的对象的副本,因此更改不会传播回主进程。如果不需要从调用的方法修改对象,这可能是一个简单的解决方案。</p>