学习文档 from https://www.liaoxuefeng.com
进程和线程
平时做客户端工作,不太接触线程的东西,进程就更没怎么接触过了。
多任务的实现:
1.多进程模式;
2.多线程模式;
3.多进程多线程模式。
Python既支持多进程,也支持多线程。
多进程
1.unix/linux/mac os x 可以用os.fork一个子进程做任务,如Apache服务器就是这种工作模式。。。可惜我的是windows
2.在windows上可以使用 multiprocessing 模块进行多进程编程
from multiprocessing import Process
3.启动大量子进程,使用进程池
from multiprocessing import Pool
Pool默认大小是CPU的核数
4.子进程subprocess
5.进程间通信
multiprocessing Queue Pipes
对象pickle序列化传进入其他进程
多线程
线程是操作系统直接支持的执行单元。Python是真正的Posix线程,而不是模拟的线程
两个模块,低级的_thread,高级的threading对_thread进行了封装
import threading
主线程MainThread
多线程和多进程最大的区别在于,在多进程中,同一个变量在不同的进程中有不同的实例,而多线程中是所有线程是共享同一个变量的。
线程threading.Thread()
锁threading.Lock()
获得锁,释放锁
多个锁容易导致所有线程挂起
Python执行时,解释器有个Global Interpreter Lock,导致python的多线程不能使用多核。而(c java却可以),python可以使用多进程使用多核。
ThreadLocal
线程的局部变量
局部变量传递问题,如果不需要传递,可以建一个全局的dict根据线程key,存起来,使用时根据线程再取出。
更简单的方法使用ThreadLocal,每个线程都可以对其读写同一个变量名的变量,且互不影响
threading.local()
进程 vs. 线程
实现多任务一般是Master-Worker模式。Master一个,负责分配任务,Worker多个,负责完成任务。
多进程实现多任务,就是主进程是Master,其它进程是Worker
多线程实现多任务,就是主线程是Master,其它线程是Worker
多进程的优点:稳定,子进程间互不影响,挂掉一个,其他还正常。主线程挂,才都挂。缺点:代价高,有数量限制。早期的Apache
多线程的优点:比多进程快点儿(也快不到哪儿去,windows上更快点儿),但是一个线程死,容易整个进程都死。早期的IIS服务
现在的Apache与IIS 在 多线程 + 多进程
线程切换
多任务切换是有代价的,任务的环境(cpu寄存器,内存页)
计算密集型 vs. IO密集型
计算密集型,主要消耗CPU资源,如视频解码,最高效的利用cpu,核数 = 任务数,最好用c写。
IO密集型,cpu利用较低,更多时间在等待IO,如网络、磁盘IO,此时,任务越多,效率越高,常见的如web应用,这种脚本语言最好,c语言最差。
异步IO
现在操作系统对IO操作支持异步IO,可使单进程单线程执行多任务,这种模型称为事件驱动模型,Nginx就是支持异步IO的
对于Python,单线程的异步模型称为协程。
分布式进程
在Thread和Process中,优先选Process,其更稳定,并且Process可以被分布到多个机器,而Thread只能分布到同一台机器上的多个CPU上,
multiprocessing的子模块managers,依靠网络通信,可以把多进程分布到多台机器上
queue.get 挂起式等待
queue对象存储在master进程,注意queue的获取不要绕过QueueManager的封装。