Concurrent Execution #
并发工具选择将取决于任务的类型(CPU密集型 vs IO密集型)以及偏好的开发风格(事件驱动的协作式多任务 vs 抢占式多任务处理)。
- threading - 多线程,基于线程的并行
- multiprocessing - 多进程,基于进程的并行
- subprocess - 子进程管理
- concurrent.futures - 启动并行任务
- asyncio — 异步 I/O
并发技术对比:
- 多线程可以应用于大多数场景。但由于GIL,多线程不适合计算密集型并发任务。
- 多进程可以充分利用多核处理器的多个内核,但需要考虑进程间的通信成本。如果使用共享内存,访问共享对象又会让代码变得复杂。
- concurrent.futures模块定义了一个抽象future,它可以通过几乎相同的语法使用线程和进程。通过它可以很容易地在进程和线程间切换,查看哪种方法更快。
- asyncio中的协程,所以没有真正地并行处理;协程之间的控制允许单个线程在等待I/O和计算之间交替执行。
concurrent.futures, asyncio提供了比底层库更易使用的接口。
asyncIO是Python并发编程的最新技术。它结合future和事件循环的概念,引入了协程。这是一种非常优雅和易于理解的编写响应式程序的方法,不会浪费时间等待输入或其他I/O操作。