美文网首页
37.5-Event总结

37.5-Event总结

作者: BeautifulSoulpy | 来源:发表于2020-01-27 10:30 被阅读0次

    告诉自己,人终要有一场触及灵魂的旅行,看尽繁华如落,春红如醉,走孤独的路,遇正确的人,惊鸿一面只是惊艳了时光,深情不减才能温柔岁月。在路过万千风景之后,方能品味,江山如画!


    总结:

    1. event.wait方法使这个线程只能干这事了;等着任务完成;
    2. 一定要知道你当前的代码是在 哪个线程中执行的;
    
    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
    

    相关文章

      网友评论

          本文标题:37.5-Event总结

          本文链接:https://www.haomeiwen.com/subject/lbgnactx.html