37.5-Event总结
2020-01-27 本文已影响0人
BeautifulSoulpy
告诉自己,人终要有一场触及灵魂的旅行,看尽繁华如落,春红如醉,走孤独的路,遇正确的人,惊鸿一面只是惊艳了时光,深情不减才能温柔岁月。在路过万千风景之后,方能品味,江山如画!
总结:
- event.wait方法使这个线程只能干这事了;等着任务完成;
- 一定要知道你当前的代码是在 哪个线程中执行的;
from threading import Event, Thread
import logging
import time
FORMAT = '%(asctime)s %(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)
def boss(event: Event):
logging.info("I'm boss, waiting for U.")
# 等待
event.wait() # 阻塞,等到返回True;
logging.info("Good Job.")
def worker(event: Event, count=10):
logging.info("I'm working for U.")
cups = []
while True:
logging.info('make 1')
time.sleep(0.5)
cups.append(1)
if len(cups) >= count:
# 通知
event.set() # 变为 True;
break
logging.info('I finished my job. cups={}'.format(cups))
event = Event()
w = Thread(target=worker, args=(event,))
b = Thread(target=boss, args=(event,))
w.start()
b.start()
#---------------------------------------------------
1. Event练习
实现Timer,延时执行的线程,延时计算add(x,y);
思路
Timer的构造函数中参数得有哪些?
如何实现start启动一个线程执行函数
如何cancel取消待执行任务
思路实现
from threading import Event, Thread
import logging
logging.basicConfig(level=logging.INFO)
def add(x: int, y: int):
logging.info(x + y)
class Timer:
def __init__(self, interval, fn, *args, **kwargs):
pass
def start(self):
pass
def cancel(self):
pass
完整实现
from threading import Event, Thread
import datetime
import logging
logging.basicConfig(level=logging.INFO)
def add(x: int, y: int):
logging.info(x+y)
class Timer:
def __init__(self,interval,fn,*args,**kwargs):
self.interval = interval
self.fn = fn
self.args = args
self.kwargs = kwargs
self.event = Event()
def start(self):
Thread(target=self.__run).start()
def cancel(self):
self.event.set()
def __run(self):
start = datetime.datetime.now()
logging.info('waiting')
self.event.wait(self.interval)
if not self.event.is_set():
self.fn(*self.args, **self.kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
logging.info('finished {}'.format(delta))
self.event.set()
t = Timer(10, add, 4, 50)
t.start()
e = Event()
e.wait(4)
# t.cancel()
print('==========')
#--------------------------------------------------------------------------------------------
INFO:root:waiting
==========
INFO:root:54
INFO:root:finished 10.000271