python apply_async怎么返回值_Python多处理apply_async在Windows 7上从不返回结果

本文介绍了在Windows 7环境下,使用Python3的multiprocessing库时遇到apply_async无法返回结果的解决方法。通过修改FunctionType的创建方式,实现了在Windows上正确运行并获取apply_async的结果。示例代码展示了如何修改原始问题代码,使得cube函数能正确计算并返回立方值。
摘要由CSDN通过智能技术生成

我在运行python 3,IDE是spyder in anaconda(windows),所以这个技巧对我不起作用。我试了很多,但没什么不同。我找到了我的问题的原因,也是达诺在他的笔记中列出的。但经过一整天的搜索,我找到了一些解决方案,它帮助我运行与windows机器相同的代码。这个网站帮助我找到了解决方案:

因为我使用的是Python3,所以我对程序做了如下更改:from types import FunctionType

import marshal

def _applicable(*args, **kwargs):

name = kwargs['__pw_name']

code = marshal.loads(kwargs['__pw_code'])

gbls = globals() #gbls = marshal.loads(kwargs['__pw_gbls'])

defs = marshal.loads(kwargs['__pw_defs'])

clsr = marshal.loads(kwargs['__pw_clsr'])

fdct = marshal.loads(kwargs['__pw_fdct'])

func = FunctionType(code, gbls, name, defs, clsr)

func.fdct = fdct

del kwargs['__pw_name']

del kwargs['__pw_code']

del kwargs['__pw_defs']

del kwargs['__pw_clsr']

del kwargs['__pw_fdct']

return func(*args, **kwargs)

def make_applicable(f, *args, **kwargs):

if not isinstance(f, FunctionType): raise ValueError('argument must be a function')

kwargs['__pw_name'] = f.__name__ # edited

kwargs['__pw_code'] = marshal.dumps(f.__code__) # edited

kwargs['__pw_defs'] = marshal.dumps(f.__defaults__) # edited

kwargs['__pw_clsr'] = marshal.dumps(f.__closure__) # edited

kwargs['__pw_fdct'] = marshal.dumps(f.__dict__) # edited

return _applicable, args, kwargs

def _mappable(x):

x,name,code,defs,clsr,fdct = x

code = marshal.loads(code)

gbls = globals() #gbls = marshal.loads(gbls)

defs = marshal.loads(defs)

clsr = marshal.loads(clsr)

fdct = marshal.loads(fdct)

func = FunctionType(code, gbls, name, defs, clsr)

func.fdct = fdct

return func(x)

def make_mappable(f, iterable):

if not isinstance(f, FunctionType): raise ValueError('argument must be a function')

name = f.__name__ # edited

code = marshal.dumps(f.__code__) # edited

defs = marshal.dumps(f.__defaults__) # edited

clsr = marshal.dumps(f.__closure__) # edited

fdct = marshal.dumps(f.__dict__) # edited

return _mappable, ((i,name,code,defs,clsr,fdct) for i in iterable)

在这个函数之后,上面的问题代码也有点像这样改变了:from multiprocessing import Pool

from poolable import make_applicable, make_mappable

def cube(x):

return x**3

if __name__ == "__main__":

pool = Pool(processes=2)

results = [pool.apply_async(*make_applicable(cube,x)) for x in range(1,7)]

print([result.get(timeout=10) for result in results])

我得到的结果是:[1, 8, 27, 64, 125, 216]

我认为这篇文章可能对一些windows用户有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值