多处理,多线程或asyncio

时间:2016-12-21 19:18:24

标签: python python-3.x

我目前正在努力解决如何在Python 3.5 +中解决这个问题。

我的代码如下:

while True:
    do_process1() # run this synchronously
    do_process2() # don't wait on this to go to the next iteration but need to handle its completion

在这种情况下,do_process2()需要很长时间。我希望do_process2()以异步方式运行,以便循环的下一次迭代不会等待do_process2()完成。

从我阅读的内容来看,我可以使用多线程,但是对于GIL,我不知道我怎么可能"卸载" do_process2()并继续执行下一次迭代。

似乎多处理在这里很合适。话虽如此,我看到的很多例子都是在子流程上等待来完成工作。我不想这样做,我想继续执行while循环。

同样,我希望能够处理从do_process2()的异步调用的回调,以便我可以处理该操作的完成。我看到我可以使用Pool对象apply_async()来做到这一点,但这是最好的方法吗?

这里最好的方法是什么?而且我使用的是Python 3.5+,所以想知道asyncio适合所有这些吗?我认为像多线程一样,我不会在寻找卸载和继续工作方面获得收益。

1 个答案:

答案 0 :(得分:0)

这取决于do_process2内部究竟发生了什么,multiprocessing总是安全的选择(一种适合所有类型),因为CPython在线程和GIL方面有一些记录的问题,有一些事件驱动的解决方案,但其中一些有可移植性问题(我在Windows中运行了很多Python代码,因此可移植性对我来说是一个交易破坏者),最后有asyncio这很酷,但正如通知所说

  

asyncio软件包已临时包含在标准库中。如果核心开发人员认为有必要,可能会发生向后不兼容的更改(包括删除模块)。