- 论坛徽章:
- 4
|
回复 4# Hadron74
刚开始用python不久,只能边看边试,在您说的那个贴子里,有三种方法,但是各自情况不一。
1. 使用copy_reg来注册需要pickle支持的方法。这种方法有个副作用(是帖子的后面的人说的),说是当注册的方法被调用完之后,在所在的processor上,会默认调用类对象的destructor方法,于是,当每个processor上,方法需要执行超过一次时,会出现找不到对象的问题。
2. 使用__call__,简单说:给类加一个def __call__()方法,在些方法中,调用需要传递的函数调用。这种方法不需要注册,可以使用,但是它也有使用限制,就是只能传递一个方法,当超过一个方法时,这种方法就不能解决问题了。
3. 使用metaclass相关的getattr方法,但是因为没有接触过多少python中multiprocessor的东西,看起来有些晕,那个人说,这种方法可以支持多个方法通过类传递,同时又不会出现方法2和1的问题。只是,我现在读的不是很明白--之后慢慢读,先把那人的代码再贴到这里一边吧。- import multiprocessing
- import os
- def call_it(instance, name, args=(), kwargs=None):
- "indirect caller for instance methods and multiprocessing"
- if kwargs is None:
- kwargs = {}
- return getattr(instance, name)(*args, **kwargs)
- class Klass(object):
- def __init__(self, nobj, workers=multiprocessing.cpu_count()):
- print "Constructor (in pid=%d)..." % os.getpid()
- self.count = 1
- pool = multiprocessing.Pool(processes = workers)
- async_results = [pool.apply_async(call_it,
- args = (self, 'process_obj', (i,))) for i in range(nobj)]
- pool.close()
- map(multiprocessing.pool.ApplyResult.wait, async_results)
- lst_results = [r.get() for r in async_results]
- print lst_results
- def __del__(self):
- self.count -= 1
- print "... Destructor (in pid=%d) count=%d" % (os.getpid(), self.count)
- def process_obj(self, index):
- print "object %d" % index
- return "results"
- Klass(nobj=8, workers=3)
复制代码 基本上就是这些了,呵呵。 |
|