Python并发编程-线程同步(线程安全)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作。
一.Event
1>.Event的常用方法
Event事件,是线程通信机制中最简单的实现,使用一个内部的标记flag,通过flage的True或False的变化来进行操作。 常用方法如下: set():
标记为True。 clear(): 标记设置为Flase。
is_set():
查询标记是否为True。 wait(timeout=None):
设置等待标记为True的时长,None为无线等待。等到返回True,未等到超时了返回False。
2>.Event使用案例
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 7 from threading import Event,Thread 8 import logging 9 10 FORMAT = "%(asctime)s %(threadName)s %(thread)s %(message)s" 11 logging.basicConfig(format=FORMAT,level=logging.INFO) 12 13 def boss(event:Event): 14 logging.info("I'm boss,waiting for U") 15 event.wait() #阻塞等待,直到event被标记为Ture 16 logging.info("Good Job.") 17 18 def worker(event:Event,count=10): 19 logging.info("I'm working for U.") 20 cups = [] 21 while not event.wait(0.5): #使用wait等待0.5秒(相当于"time.sleep(0.5)"),若规定事件内event依旧标记依旧没有设置为True,则返回False 22 logging.info("make 1 cup") 23 cups.append(1) 24 if len(cups) >= count: 25 event.set() #将标记设置为True 26 break 27 logging.info("I finished my job.cups={}".format(cups)) 28 29 event = Event() 30 print(event.is_set()) #event实例的标记默认为False 31 32 b = Thread(target=boss,name="boss",args=(event,)) 33 w = Thread(target=worker,name="worker",args=(event,)) 34 b.start() 35 w.start()
2019-11-23 14:54:53,177 boss 10916 I'm boss,waiting for U 2019-11-23 14:54:53,178 worker 15672 I'm working for U. False 2019-11-23 14:54:53,678 worker 15672 make 1 cup 2019-11-23 14:54:54,179 worker 15672 make 1 cup 2019-11-23 14:54:54,680 worker 15672 make 1 cup 2019-11-23 14:54:55,180 worker 15672 make 1 cup 2019-11-23 14:54:55,680 worker 15672 make 1 cup 2019-11-23 14:54:56,181 worker 15672 make 1 cup 2019-11-23 14:54:56,681 worker 15672 make 1 cup 2019-11-23 14:54:57,181 worker 15672 make 1 cup 2019-11-23 14:54:57,681 worker 15672 make 1 cup 2019-11-23 14:54:58,182 worker 15672 make 1 cup 2019-11-23 14:54:58,182 worker 15672 I finished my job.cups=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 2019-11-23 14:54:58,182 boss 10916 Good Job.