专栏首页python3Python线程Event例子

Python线程Event例子

需求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("主线程完成")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python unittest框架

    测试用例:测试用例对象是最小的测试单位,针对指定的输入来测试期待的输出。由类TestCase的派生类或FunctionTestCase类来创建的。

    py3study
  • Python把类当做字典来访问

    如果我们想直接通过字典的方式访问类,obj=A(),dict(obj)直接拿到类的所有实例变量,可以通过如下方式:

    py3study
  • python font的处理

    上面的程序时可以正常运行的,其中被高亮的代码是会出错的地方,课本上的源代码是self.font=pygame.font.Sysfont(None,48),但是编...

    py3study
  • 还怕Github被墙?项目团队开发必备技能!

    最近在做一个大项目,代码量非常大,需要一个代码库存放,而现有的Github、GitLab不适合存放私密的代码,于是自建代码服务器,存放代码,于是今天这篇文章应任...

    公众号guangcity
  • 关于sequence问题的紧急处理(r2第26天)

    今天早上收到邮件,说有一个很紧急的问题,是关于sequence的。 错误日志里面还有ORA的错误 ----- ... 7 more Cause...

    jeanron100
  • centOS 如何安装 lnmp 环境

    魏艾斯博客www.vpsss.net
  • MIT 深度学习导论来啦!附视频下载

    相信很多同学读过MIT的《算法导论》(Introduction to Algorithms)这本书,虽称“导论”,但其内容还是很丰富的。

    CV君
  • 尽管领袖被捕,Cobalt 黑客组织仍然活跃

    俄罗斯安全公司 Group-IB 近期发现,专门窃取银行和金融机构资金的 Cobalt 黑客组织仍然活跃,尽管其领导人于两个月前在西班牙被捕,但其成员仍在继续针...

    周俊辉
  • 把canvas标签里的图像下载成本地图片文件

    有些在线图片网站,进行图像处理比如去除背景后,结果图片是以html5里canvas标签的形式显示出来的,我们没有办法通过右键点击图片然后下载的方式去保存到本地。

    Jerry Wang
  • 【编程基础】聊聊如何学习Java-入门篇

    本博客宗旨是扫除你学习编程之前的信心障碍,零基础学习Java知识,总结前辈经验接合实际编程来谈谈Java学习。 学习编程你准备好了吗?你有信心吗? ?...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券