python模块学习(threading模块中的Lock类和RLock类)

来源:互联网 发布:2017最流行网络用语 编辑:程序博客网 时间:2024/06/04 23:35

学习版本3.5.2

Lock类:一个线程对资源进行加锁操作之后其它线程就必须等它释放锁之后才能对该资源进行操作。acquire()与acquire_lock()都是加锁操作,release()与release_lock()都是释放锁操作,locked()与locked_lock()都是查询当前锁的状态。

RLock类:线程对资源进行加锁操作后,该线程还能继续对该资源加锁,加锁和释放锁的数量需要是一样的。acquire()是加锁操作,release()是释放锁操作。最大的作用就是在递归调用的时候避免死锁。

import threadingif __name__ == "__main__":    lock = threading.Lock()    #lock = threading.RLock()使用这句的时候下面就不会死锁    lock.acquire()    lock.acquire()#死锁    lock.release()    lock.release()

不用锁的时候

#/usr/bin/python3# -*- utf-8 -*-#学习版本3.5.2import threadingimport timedef test(num):    global value    #lock.acquire()    print(num)    value += num    print(value)    #lock.release()if __name__ == "__main__":    threadlist = []    #lock = threading.Lock()    value = 10    for i in range(5):        t = threading.Thread(target=test,args=(i,))        threadlist.append(t)    for t in threadlist:        t.start()    print("main")

运行结果

0101211main13316420

用锁的情况

#/usr/bin/python3# -*- utf-8 -*-#学习版本3.5.2import threadingimport timedef test(num):    global value    lock.acquire()    print(num)    value += num    print(value)    lock.release()if __name__ == "__main__":    threadlist = []    lock = threading.Lock()    value = 10    for i in range(5):        t = threading.Thread(target=test,args=(i,))        threadlist.append(t)    for t in threadlist:        t.start()    print("main")

运行结果

010111213316420main



阅读全文
0 0
原创粉丝点击