Python的常用并发
并发与并行的区别
并发(concurrent)是指计算机可以处理多个任务,且并非像串行执行,这些任务并不需要等待计算机完成其中一个后再开始下一个,而是可以在多个任务间切换执行,或者同时执行多个任务。
并行(parallelism)是指则是指多核计算机可以使用自己的多个CPU同时独立地执行多个任务。从定义上可以看出,并行的要求更为严格。必须是多核计算机利用其多核同时处理多个任务。而并发并不要求一定是调用多核同时工作,仅仅调用单核通过时分复用的方式在多个任务中切换执行也属于并发的一种。
多进程,多线程,以及GIL
像其他很多语言一样,python中的多进程可以实现并行运算。每一个进程可以调用一个CPU独立完成自己的任务。在这些进程中,每个进程都可以拥有多个线程。
然而python中的多线程是无法同时使用多个CPU的,因为在python中有一个GIL(Global Interpreter Lock)存在。在一个进程中,每个线程都需要获取GIL才能进入CPU执行,而GIL在一个进程中只存在一个,因此同一个进程里,最多只有一个线程可以在CPU中执行。只有当执行时间达到阈值,或者当前执行的线程等待时,才会释放GIL,由其他线程进行竞争。很明显,python中的多线程,属于并发的一种,但并不属于并行。
因此在python中,处理I/O密集型任务可以使用多线程,但是在CPU密集型任务中,由于多线程只能调用一个CPU,同时线程切换会产生额外开销,因此往往使用多进程。
协程
Python中的异步机制
同步与异步
协程与生成器的关系
协程工作原理
|