python-day39(正式学习)
线程锁
from threading import Thread,Lock
x=0
lock=Lock()
def test():
lock.acquire() #锁住不让cpu切换
global x
for i in range(111100):
x+=1
lock.release()
t=Thread(target=test)
t1=Thread(target=test)
t2=Thread(target=test)
t.start()
t1.start()
t2.start()
t.join()
t1.join()
t2.join()
print(x)
死锁问题及递归锁
死锁
被其他线程占用了锁头导致线程阻塞
from threading import Thread,Lock
import time
l1=Lock()
l2=Lock()
def test1():
l1.acquire()
print('one1suo')
time.sleep(1)
l2.acquire()
print('one2suo')
l1.release()
print('one1fang')
l2.release()
print('one2fang')
def test2():
l2.acquire()
print('two2suo')
l1.acquire()
print('two1suo')
l2.release()
print('two2fang')
l1.release()
print('two1fang')
t=Thread(target=test1)
t1=Thread(target=test2)
t.start()
t1.start()
递归锁
同一个锁可多次使用acquier()和release()
from threading import Thread,RLock,Lock
import time
l1=RLock()
l2=l1
def test1():
l1.acquire()
print('one1suo')
time.sleep(1)
l2.acquire()
print('one2suo')
l1.release()
print('one1fang')
l2.release()
print('one2fang')
def test2():
l2.acquire()
print('two2suo')
l1.acquire()
print('two1suo')
l2.release()
print('two2fang')
l1.release()
print('two1fang')
t=Thread(target=test1)
t1=Thread(target=test2)
t.start()
t1.start()
信号量
from threading import Thread,RLock,Lock,Semaphore
import time
def test1():
s.acquire()
print('nice')
time.sleep(1)
s.release()
s=Semaphore(5)
for i in range(15):
t = Thread(target=test1)
t.start()
GIL全局解释器锁
# 在Cpython解释器中有一把GIL锁(全局解释器锁),GIl锁本质是一把互斥锁。
# 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
# 同一个进程下多个线程只能实现并发不能实现并行.
# 为什么要有GIL?
# 因为cpython自带的垃圾回收机制不是线程安全的,所以要有GIL锁.
# 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
#
#分析:
# 我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
# 方案一:开启四个进程
# 方案二:一个进程下,开启四个线程
# 计算密集型 推荐使用多进程
# 每个都要计算10s
# 多线程
# 在同一时刻只有一个线程会被执行,也就意味着每个10s都不能省,分开每个都要计算10s,共40.ns
# 多进程
# 可以并行的执行多个线程,10s+开启进程的时间
# io密集型 推荐多线程
# 4个任务每个任务90%大部分时间都在io.
# 每个任务io10s 0.5s
# 多线程
# 可以实现并发,每个线程io的时间不咋占用cpu, 10s + 4个任务的计算时间
# # 多进程
# 可以实现并行,10s+1个任务执行的时间+开进程的时间