python进阶(4)
程序员文章站
2022-06-04 09:02:18
...
python进阶(4)
线程
线程的注意点
子线程之间共享全局变量,就会造成资源的争抢问题
互斥锁的问题
问题:
因为线程之间共享全局变量,所以,在多线程几乎在同时运行的时候,几乎同时修改同一全局变量的时候没,就要进行控制
此时,需要互斥锁
当某个线程需要修改资源的时候,先将资源进行锁定,其他线程不能修改该线程
当线程修改完成之后,并且释放完互斥锁之后,其他的线程才可以使用
互斥锁保证当前只有一个线程可以使用修改同一个资源
import threading
num = 0
def add_num1():
global num
for i in range(10000000):
lock.acquire(True)
num += 1
lock.release()
print('子线程1已经完成,此时得到的num1',num)
def add_num2():
global num
for i in range(10000000):
lock.acquire()
num += 1
lock.release()
print('子线程2已经完成,此时得到的num2',num)
if __name__ == '__main__':
lock = threading.Lock()
thread1=threading.Thread(target=add_num1)
thread2=threading.Thread(target=add_num2)
thread1.start()
thread2.start()
注意点:
- 确保了关键代码只能由一个线程从头到尾完整的执行完成
- 阻止了多线程的并发操作,包含锁的代码,其实还是单线程执行的,效率下降
- 如果当前的程序出现了多个锁,可能会出现死锁问题
死锁的问题
避免死锁的方法:
- 超时释放
- 设计的时候,避免死锁
线程安全
from queue import Queuefrom