线程是系统分配内核的最小单元,被称为轻量级的进程
线程GIL(全局解释器锁)
CPython解释器同一时刻只能解释执行一个线程,大大降低了线程的执行效率
遇到阻塞时线程会主动让出解释器,所以执行多阻塞高延迟IO时可以提升效率
创建
threading模块创建线程
自定义线程类创建线程
同步互斥
线程Event
from threading import Thread, Event
s = None # 全局变量用于通信
e = Event() # 事件对象
def myThread():
print("分支线程开始")
global s
s = 1
e.set() # 共享资源操作完毕
t = Thread(target=myThread)
t.start()
e.wait() # 阻塞等待
if s == 1:
print("分支线程先执行")
else:
print("主线程先执行")
t.join()
线程锁Lock
from threading import Thread, Lock
a = b = 0 # 共享资源
lock = Lock()
def value():
while True:
lock.acquire() # 上锁
if a != b:
print("a = %d,b = %d" % (a, b))
lock.release() # 解锁
t = Thread(target=value)
t.start()
while True:
# 上锁,代码块结束自动解锁
with lock:
a += 1
b += 1
死锁
- 两线程互相等待资源释放
避免方法:- 两线程运行同一方法
不让两线程同时运行 - 两线程运行不同方法
传入两边锁,一个方法顺序上锁,一个方法逆序上锁
- 两线程运行同一方法
- 本线程重复上锁
避免方法:使用递归锁RLock(),在一个线程内可以对同一个锁重复上锁
文档信息
- 本文作者:Weikang Yu
- 本文链接:https://AccelYu.github.io/2020/07/01/concurrent_three/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)