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.
以上代码执行结果戳这里

相关文章:

  • 2021-10-28
  • 2021-08-12
  • 2021-12-10
  • 2022-01-31
  • 2018-10-10
  • 2021-05-22
  • 2019-06-30
猜你喜欢
  • 2022-02-01
  • 2021-10-05
  • 2021-05-01
  • 2022-12-23
  • 2022-12-23
  • 2021-03-31
  • 2022-12-23
相关资源
相似解决方案