线程锁和协程学习笔记
一、线程的管理
1、多个线程都需要修改数据集,如何保证切换的过程中,数据的安全性
方法:自制锁
1 import threading 2 3 lock_obj = threading.Lock() 4 5 6 lock_obj.acquire() 7 8 ........... #要保护的代码 9 10 11 lock_obj.release()
2、如果多个锁导致多个线程争抢,程序无法继续,这就是死锁
方法:使用递归锁
递归锁内部有计数功能,当计数为0时,才允许其他线程争抢
RLock = threading.RLock()
RLock.acquire()
.......
RLock.release()
3、线程之间能否通讯?比如线程1执行完后,再执行线程2,因为2者的逻辑关系
1 import threading 2 import time 3 4 def test1(e): 5 print("test1 start") 6 e.wait() #event值等待为True才继续执行 7 print("test1 end") 8 9 def test2(e): 10 e.set() #将event值设置为True 11 12 obj = threading.Event() 13 14 t1 = threading.Thread(target=test1,args=(obj,)) 15 t2 = threading.Thread(target=test2,args=(obj,)) 16 17 t1.start() 18 time.sleep(5) 19 print("now event = True") 20 t2.start()
1 event.isSet() #返回当前event对象的值 2 3 event.clear() #将event对象的值设为False
二、协程
优点:
1、单线程,不需要切线程,适合python
2、能在保证数据的安全稳定,去掉锁的复杂使用
2.1 greenlet模块(后面模块的基础模块)
import greenlet #greenlet模块 a1 = greenlet.greenlet(func) #实例化 a1.switch() #手动切换功能
2.2 gevent模块(根据IO操作自动为你切换功能)
1 import gevent 2 3 gevent.joinall([gevent.spawn(fun1),gevent.spawn(func2)]) 4 #函数func1、func2可实现IO操作自动切换

浙公网安备 33010602011771号