Python线程Event例子

  • 2020 年 1 月 10 日
  • 笔记

需求1:Boss需要一个员工生产100个杯子,Boss一直等待员工生产完成之后方可

import threading  import logging  import time    logging.basicConfig(level=logging.INFO)    def worker(event:threading.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()              break      logging.info('I finished my job. cups={}'.format(cups))    def boss(event:threading.Event):      logging.info("I'm boss, waiting for U.")      event.wait()      logging.info("Good Job")    Event = threading.Event()  w = threading.Thread(target=worker, args=(Event, 100))  b = threading.Thread(target=boss, args=(Event, ))  w.start()  b.start()

需求2:使用threading Event实现类似Timer延迟执行的线程

思路:需要有 start和 cancel的功能(使用 Event  wait(),set(), 方法)
代码实现:  import threading  import datetime  import logging    logging.basicConfig(level=logging.INFO)    def add(x:int, y:int):      logging.info(x + y)    class Timer(object):      def __init__(self, interval, fn, *args, **kwargs):          self.interval = interval          self.fn = fn          self.args = args          self.kwargs = kwargs          self.event = threading.Event()        def start(self):          threading.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():          # 上面两行可以直接改写成 if not self.event.wait(self.interval):              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 = threading.Event()  e.wait(4)  t.cancel()    print("主线程完成")