多线程—事件Event

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。

在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象,而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真;它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件,继续执行

Event()可以创建一个事件管理标志,该标志(event)默认为False,event对象主要有四种方法可以调用:
event.wait(timeout=None):调用该方法的线程会被阻塞,如果设置了timeout参数,超时后,线程会停止阻塞继续执行;
event.set():将event的标志设置为True,调用wait 方法的所有线程将被唤醒;
event.clear():将event的标志设置为Fa1se,调用wait方法的所有线程将被阻塞;
event.is_set():判断event的标志是否为True。

需求:
线程1,代表门,一开始是打开的,每3秒需要自动关闭一下,如果有人通过,需要重新刷卡打开
线程2,代表人,人通过门,如果门是打开的直接通过,如果没有打开需要刷卡,之后门就已经打开了,通知人继续进入

import threading
import time
import random

event = threading.Event()  # 创建一个事件,事件默认为假
event.set()  # 设置标志为真,门一开始是打开的
status = 0  # 代表门的状态,如果是0-3(不包括3)代表打开,如果等于3,代表关闭


def door():
    global status
    while True:
        print('当前门的status为{}'.format(status))
        if status >= 3:
            print('当前门已经打开了3s,需要自动关闭')
            event.clear()
        if event.is_set():
            print('当前门是开的,可以通行')
        else:
            print('门已经关了,请用户自己刷卡')
            # status=0   #原来已经等于3了
            event.wait()  # 门的线程阻塞等待
            continue
        time.sleep(1)
        status += 1  # status代表门开始的秒数


def person():
    global status
    n = 0  # 人的计数器,看看有多少人进入门里面
    while True:
        if event.is_set():
            n += 1
            print('门开的,{}号人进入门里面'.format(n))
        else:
            print('门关着,{}号人刷卡,进入门里面'.format(n))
            event.set()  # 标志改为true
            status = 0
        time.sleep(random.randint(1, 10))


if __name__ == '__main__':
    d = threading.Thread(target=door)
    p = threading.Thread(target=person)
    d.start()
    p.start()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
小白可以看看 很简单的处理 原帖和原始源码在这里是超级列表框主线程线程调用时间区别 https://bbs.125.la/forum.php?mod=viewthreadtid=13916045 本例子 源码加了cpu亲和度 和线程里面利用标签反馈事件 1,CPU亲和度设置,线程里面操作超级列表框的话 我用了这个 机器没负载的情况下  线程里面写入超级列表框的速度大概比非线程慢1倍  如果不用这个线程里面写入超级列表框比非线程慢10倍,高级表格的没测试 .版本 2 SetProcessAffinityMask (-1, 1)  ' 完美 ' SetProcessAffinityMask 设置进程CPU相关性 参数设置 (2018-01-05 18:39:48)转载▼ ' 标签: setprocessaffinityma it 分类: API ' SetProcessAffinityMask ' 参数一:进程句柄    -1为自身句柄 ' 参数二:指定CPU ' 参数二的设置是二进制转十进制。参数二需填写十进制数字 ' 例如我想设置 ' 1CPU二进制为1 转换为十进制为 1 ' 2CPU二进制为10 转换为十进制为 2 ' 3CPU二进制为100 转换为十进制为 4 ' 4CPU二进制为1000 转换为十进制为 8 ' 1,2CPU二进制为11 转换为十进制为 3 ' 3,4CPU二进制为1100 转换为十进制为 12 ' 123CPU二进制为1110 转换为十进制为 14 ' 1234CPU二进制为1111 转换为十进制为 15 2,线程里面测试用超级列表框写入数据 比非线程慢很多 显示到列表框很慢  线程里面调用标签反馈  相当于 写入操作是在主线程/非线程里面进行的。 高级表格线程里面会崩溃  全部删除或者增加减少行 插入之类的操作会崩溃  同理可以这样处理  置数据不会崩溃 其他高级表格选择框按钮之类的没有测试过

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值