线程锁和协程学习笔记

一、线程的管理

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操作自动切换

 

posted @ 2017-12-31 23:32  fallthrough  阅读(360)  评论(0)    收藏  举报