python进程池调用实例方法_进程池中传递实例方法问题

1、多个进程,参数给实例方法,逐次运行时没有问题的,代码如下:

import multiprocessing

class MyClass(object):

def calc(self,num):

print 'the number is ',num

if __name__ == '__main__':

mc = MyClass()

ths = [multiprocessing.Process(target = mc.calc,args = (i,)) for i in range(3)]

for th in ths:

th.start()

运行结果:

the number is 0

the number is 1

the number is 2

2、放到进程池中一起并发

import multiprocessing

class MyClass(object):

def calc(self,num):

print 'the number is ',num

if __name__ == '__main__':

mc = MyClass()

pool = multiprocessing.Pool(processes = 3)

pool.apply_async(mc.calc,(3,))

pool.apply_async(mc.calc,(4,))

pool.apply_async(mc.calc,(5,))

pool.close()

pool.join()

print 'end!'

运行结果:

end!

只打印了最终结果,传递进去的实例方法压根没有运行!!!

3、解决方法如下:

import multiprocessing

import copy_reg

import types

def _reduce_method(m):

if m.im_self is None:

return getattr, (m.im_class, m.im_func.func_name)

else:

return getattr, (m.im_self, m.im_func.func_name)

copy_reg.pickle(types.MethodType, _reduce_method)

class MyClass(object):

def calc(self,num):

print 'the number is ',num

if __name__ == '__main__':

mc = MyClass()

pool = multiprocessing.Pool(processes = 3)

pool.apply_async(mc.calc,(3,))

pool.apply_async(mc.calc,(4,))

pool.apply_async(mc.calc,(5,))

pool.close()

pool.join()

print 'end!'

运行结果:

the number is 4

the number is 3

the number is 5

end!

当在子进程的进程池中使用实例方法,程序实际调用multiprocessing.Pipe进行序列化数据。python2.7中,multiprocessing.Pipe使用C语言实现的,会立即调用

pickle_dumps,而不是调用ForkingPickler,所以传递进去的实例方法无法工作。

然而,如果使用copy_reg注册实例方法,如上不可能将变为可能。

python3.0之后的版本,可正常序列化实例方法,就不需要使用copy_reg了。

详细说明还可参考:

http://stackoverflow.com/questions/27318290/why-can-i-pass-an-instance-method-to-multiprocessing-process-but-not-a-multipro

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值