我正在尝试通过Python中的回调来实现异步多处理编程。我阅读了有关多处理模块,过程/线程池和异步模块的材料,但无法指向。我有一个像
这样的卷曲和回调功能async def func(x):
value = await (other coroutine)
return x
def callback(x):
print(x)
我想将功能(1(,func(2(,func(3(,...,func(100(提交给给定数字的工作流程池,例如5个流程。然后,我想让那些工人在任何返回值到达父进程时都调用回调,而不是在每个返回值到达父进程之后。
MAP/MAP_ASYNC/starmap/starmap_async方法多处理中的方法等待工作流程中的所有返回都到达父进程。我研究了python中异步模块中异步编程的基本元素,但是对于我来说,完成上述任务仍然难以捉摸 - 异步的多处理编程,带有回调
有人可以给我一个清醒的示例代码吗?
预先感谢。
我认为您想要以骇人听闻的方式:
import asyncio
import random
from concurrent.futures import ProcessPoolExecutor
async def do_sth(future, n):
await asyncio.sleep(random.randint(1, 5))
future.set_result('{} is done!'.format(n))
def got_result(fut):
print(fut.result())
if __name__ == '__main__':
executor = ProcessPoolExecutor(5)
task = []
loop = asyncio.get_event_loop()
for n in range(1, 100):
future = asyncio.Future()
task.append(
asyncio.ensure_future(do_sth(future, n))
)
future.add_done_callback(got_result)
try:
loop.run_until_complete(asyncio.gather(*task))
finally:
loop.close()
但我建议您考虑您从Combine Multi-Process和Asyncio回调中真正获得的收益,我认为您实际想要的可能是 queue和Multi-Process 。