事件,条件

Posted xiongchao0823

tags:

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

事件

  • 其实就是开两条线程,一条进行数据传输
  • 另外一条,查看网络是否安全,如果不行就会clear(),也就是给数据传输的那条线程一个信号,
  • 主要原理就是wait()方法,只有当事件为True的时候才可以继续运行,不然就会被wait()方法阻塞住,默认是False , is_set()方法是查看事件状态的
# 模拟拿数据断网了的操作

from threading import Thread, Event
import random
import time

e = Event()

def foo():
    while 1:
        e.wait(3)  # 阻塞,如果时间状态为False则会阻塞,反之,可以通过
        time.sleep(0.6)
        if e.is_set() == True: # is_set 查看事件状态为False还是True
            print("拿到数据啦")
        else:
            print("断网了")
            break


def foo1():
    for i in range(5):
        time.sleep(1)
        state = i
        if state != 3:
            e.set() # 如果不为3,就把他设置成True,就可以取数据
        else:
            e.clear() # 如果为3,就设置成False

def foo2():
    time.sleep(4)
    e.set()

t = Thread(target=foo)
t1 = Thread(target=foo2)
t.start()
t1.start()

条件

  • 总的来说条件就是一个更加复杂的锁
# 条件其实就是更加复杂的锁

from threading import Thread,Condition

cond = Condition()

def foo():
    cond.acquire()  #  必须包裹住 wait() 方法
    cond.wait()
    print("进来一个")
    cond.release() #  必须包裹住 wait() 方法

for i in range(10):  # 设置10个线程,通过完就没有了
    t = Thread(target=foo)
    t.start()

while 1:
    num = input("请输入放行的子进程个数:")  # 相当于给线程设置了个告诉加油站的收费处
    cond.acquire() #  必须包裹住 notify() 方法
    cond.notify(int(num))
    cond.release() #  必须包裹住 notify() 方法

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

带有条件的淘汰赛事件绑定

Flutter BLoC 事件竞争条件

一个条件,多个事件

事件,条件

条件不适用于 DragEnd 事件

在事件驱动的嵌入式系统中使用事件队列避免竞争条件