文章目录
一、基础概念
①并发: 系统在一段时间内,处理多个任务的能力
②并行: 系统在同一时刻,处理多个任务的能力
③同步: 当进程执行到一个IO(等待外部数据)的时候,等待,不继续向下运行。
④异步: 当进程执行到一个IO(等待外部数据)的时候,不等待,而是先执行其他代码,一直到数据接收成功,再回来处理。
⑤GIL: 全局解释锁,是CPython解释器加的锁。不论有多少个CPU,在同一时刻,同一进程下,即使有多个线程,也只能有一个线程被执行。
⑥任务分两种: IO密集型和计算密集型。
对于IO密集型的任务,python的多线程可以加快速度,也可以采用多进程+协程处理。
对于计算密集型的任务,python的多线程反而因为切换的开销,增加处理时间。
二、同步锁
同步锁也叫互斥锁
(1)未加同步锁情形
import threading
import time
def sub():
global num
temp = num
time.sleep(0.001)
num = temp -1
num = 100
l = []
for i in range(100):
t = threading.Thread(target=sub)
t.start()
l.append(t)
for t in l:
t.join()
print(num) # 98 输出结果不确定
上述代码中,各个线程在时间片轮转时,自己可能还没执行完,造成num值还未改变,就切换到其他线程了。所以num的值输出不固定(取决于cpu的执行速度)
(2)加同步锁情形
import threading
import time
def sub():
global num
lock.acquire() # 申请同步锁
temp = num
time.sleep(0.001)
num = temp - 1
lock.release() # 释放同步锁
num = 100
l = []
lock = threading.Lock() # 创建同步锁对象
for i in range(100):
t = threading.Thread(target=sub)
t.start()
l.append(t)
for t in l:
t.join()
print(num) # 0
原线程在执行 lock.acquire() 后,线程不允许被切换去执行函数体内的代码,其他线程被阻塞在 **lock.acquire()**这句代码,原线程在执行 lock.release() 后,才允许切换线程。
三、线程死锁和递归锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。这两个线程在无外力作用下将一直等待下去。例:
import threading
import time
class MyThread(threading.Thread):
def actionA(self):
A.acquire()
print(self.name,"actionA gotA",time.strftime("%X"))
time.sleep(1)
B.acquire()
print(self.name, "actionA gotB", time.strftime("%X"))
time.sleep(1)
B.release()
A.release


1917

被折叠的 条评论
为什么被折叠?



