Python并发技术
Python并发技术
1、前言
目前大多数编程语言都直接支持并发,而且其标准库通常还提供了一些封装程度较高的功能。并发可以用多种方式来实现,这些方式*重要的区别在于如何访问”共享数据”:是通过”共享内存”等方式直接访问,还是通过”进程间通信”等方式访问。
基于线程的并发:是指同一个系统进程里有各自独立的若干个线程,它们都在并发执行任务。这些线程一般会依序访问共享内存,以此实现数据共享。程序中,通常采用某种锁定机制来确保同一时间只有一个线程能够访问数据。
基于进程的并发:是指多个进程独立地执行任务,这些进程一般通过IPC来访问数据,如果编程语言或者程序库支持,那么也可以通过共享内存来实现数据共享。
还有一种并发,它基于并发等待,而非并发执行,这种方式通常用来实现异步IO。
Python都支持上述两种方式。
Python对多线程的支持方式相当普通,但对于多进程的支持则比大多数语言或程序库更为高级,此外Python的多进程与多线程采用同一套机制,使得开发者很容易就能在两套方案中来回切换。
由于全局解释器锁(GIL),所以Python解释器器在同一刻只能运行于一个处理器中,因此想通过多线程并发来提升程序速度,其效果可能仍然不够理想。
一般来说,计算密集型任务不适合用多线程来实现,因为者通常比非并发程序还要慢。
一种方法是改用Cython来编写代码,Cython代码实际上与Python一样,只是多加了一套写法,能够把程序编译成纯C。这种程序执行起来可以比原来快100倍,而并发很难达到这样的效果。
如果遇到使用并发的场合,而所执行的任务又是计算密集型的,*好避开GIL,改用multiprocessing模块。如何使用多线程,那么同一个进程里的线程在执行时会相互争抢GIL,但如果改用multiprocessing模块,那么每个进程都是独立的,它们都有自己的Python解释器锁,所以就不会争夺GIL了。
对于网络通信等”网络密集型”任务来说,并发可以大幅提高程序执行速度,在这种情况下,决定程序效率的注意因素是网络延迟,这与使用线程还是进程来实现并发没有多大关系。
2、计算密集型并发
使用多线程来执行计算密集型任务的效率比非并发程序的效率还要低,
这是因为python 将所有处理任务都放在了同一个核里。
使用多进程会把任务排布在多个核心上面。
计算密集型程序所使用的线程或进程数量一般与核心数相同。
(1) 用队列及多进程实现并发
(2)用Future及多进程实现并发
Python 3.2 新增了concurrent.futures模块,提供了一种优雅而高级的方式,可以用多线程或多进程实现并发。
3、IO密集型并发
(1)用队列及线程实现并发
(2) 用Future及多进程实现并发