多线程:异步,子任务独立,并行处理来提升任务效率
使用非阻塞I/O
使用多线程变成和共享数据结构Queue
用户请求线程
请求处理器
应答线程
18.2线程和进程
进程:程序一次执行过程,有自己地址,内存,数据栈
可通过fork和spawn完成其他任务,使用进程间通讯IPC
18.2.2线程
同一进程的线程共享运行环境,并发执行,容易导致不安全
18.3Python、线程和全局解释器锁
Python虚拟机执行Python代码,任意时刻,只有一个程序在CPU中运行
全局解释器锁GIL:对Python虚拟机的访问,保证同一时刻只有一个线程运行
执行过程:
1 设置GIL
2切换到一个线程运行
3 运行:
a:指定指令 或
b:线程让出控制
4 把线程设置为睡眠状态
5 解锁GIL
6 重复以上所有步骤
18.3.2 退出线程
threading模块能确保重要子线程退出,进程才会结束
18.3.3 在Python中使用线程
使用能够POSIX兼容的线程pthreads
不要使用thread的原因:主线程结束,子线程被强制结束
18.4 thread模块
提供:锁,互斥锁,互斥量
start_new_thread(function ,args ,kwargs=None):产生新线程,在新线程中用指定参数和可选的kwargs来调用函数
allocate_lock():分配锁
exit():
LockType类型锁对象
acquire(wait=None) : 尝试获取锁对象
locked() :获取锁对象就返回True,否则返回False
release():释放锁
18.5 threading模块
Thread:线程执行对象
Lock:锁原语对象
RLock:可重入锁对象,可再次获得已经获得的锁
Condition:条件变量对象能让线程暂停,等待其他线程满足条件,如状态改变
Event:通用条件变量,多线程可等待某时间发生,事件发生,所有线程被激活
Seamphore:为等待的线程提供等候室结构
BoundedSeamphore:不允许超过初始值
Timer:需要等待一段时间后才运行
守护线程:threading支持,thread不支持,。
守护线程:等待客户请求的服务器,服务器线程运行在无限循环中
主线程退出,不用等子线程完成,设置线程daemon属性
在thread.start()前,调用setDaemon(True)设定线程
18.5.1 Thread类
threading的Thread类是主要的运行对象
创建线程方式:
1、 创建Thread实例,传递给它一个函数
2、 创建Thread实例,传递可调用类对象
3、 从Thread派生子类,创建子类实例
Thread对象函数
start():开始执行
run():定义线程功能函数
join(timeout=None):程序挂起,直到线程结束;如果设置timeout,最多阻塞timeout秒
getName():返回线程名字
setName(name):设置线程名字
isAlive():表示线程是否还在运行
isDaemon():返回线程的daemon标志
setDaemon(damonic):把线程的daemon标志设定
使用线程韩寒苏:会使用apply()函数
18.5.5 threading模块中其他函数
activeCount():返回当前活动线程对象数量
currentThread():返回当前线程对象
enumerate():返回活动线程列表
settrace(func):为线程设置追踪函数
setprofile(func):为线程设置profile函数
18.5.5 生产者-消费者问题和Queue模块
Queue模块
qsize():返回队列大小
empty()
full()
put(item , block=0): 如果block不为0,
get(block=0):从队列中获取对象,如果block不为0,函数会一直阻塞到有对象为止。
相关模块
mutex:互斥对象
SocketServer:具有线程控制的TCP和UDP管理器