3.2.4 事件

Posted infinitecodes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.2.4 事件相关的知识,希望对你有一定的参考价值。

Events

An event is a simple synchronization object;

一个事件就是一个简单的同步对象;

the event represents an internal flag,

事件代表一个内部标记,

and threads can wait for the flag to be set, or set or clear the flag themselves.

并且线程可以等待标记被设定,也可以设定或者清除标记本身。

event = threading.Event()

event.wait()

# a client thread can wait for the flag to be set

一条客户端线程可以等待标记被设定

event.set()

event.clear()

# a server thread can set or reset it

一条服务端线程可以设定或重置标记

If the flag is set, the wait method doesn’t do anything.

如果标记被设定,wait()方法不会做任何事

If the flag is cleared, wait will block until it becomes set again.

如果标记被清除,wait()方法会阻塞直到标记再次被设定

Any number of threads may wait for the same event.

任何数量的线程可以等待相同的事件

通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥灯,生成几个线程做车辆,车辆行驶按红

灯停,绿灯行的规则。

下面是红绿灯事件示例

import threading
import time

event = threading.Event()    #事件写法,实例化一个事件

def light():    #红绿灯
    count = 0    #设置读秒
    event.set()    #事件启动
    while True:
        if 5 < count < 11:    #6-10秒时红灯亮
            print(‘33[1;30;41mRed light is counting 33[0m‘, count)
            event.clear()    #红灯亮时事件结束
        elif count > 10:    #超出10秒循环结束,计时器归零,事件重新启动
            count = 0
            event.set()
        else:    #0-5秒绿灯亮,此时事件启动中
            print(‘33[1;30;42mGreen light is counting 33[0m‘, count)
        time.sleep(1)
        count += 1

def car(name):
    while True:
        if event.is_set():    #事件启动时,绿灯亮,可通行
            print(‘33[1;30;42m%s is passing...33[0m‘ % name)
            time.sleep(1)
        else:
            print(‘33[1;30;41m%s is waiting...33[0m‘ % name)
            event.wait()    #事件等待中,红灯亮


light1 = threading.Thread(target=light, )
light1.start()
car1 = threading.Thread(target=car, args=(‘BMW‘, ))
car1.start()

运行结果

技术图片





以上是关于3.2.4 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用事件侦听器来加载动画片段的循环

Android:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法

C#常用代码片段备忘

从活动中调用片段事件

选择选项卡片段时触发啥事件

Reactreact概述组件事件