zoukankan      html  css  js  c++  java
  • 事件,条件

    事件

    • 其实就是开两条线程,一条进行数据传输
    • 另外一条,查看网络是否安全,如果不行就会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() 方法
    
    
    
  • 相关阅读:
    017 文件xfs_repair恢复,xfs_dump恢复,lvm动态扩容
    003 rsync客户端与服务端小脚本
    002 rsync守护进程传输方式详解
    001 期中架构简介、备份初识
    016 netstat、磁盘分区(fdisk、gdisk)
    015 Linux中常用的信号、HUP信号
    014 进程(PS与TOP)
    013 源码安装(Nginx&php为例)
    本地、远程仓库的搭建
    第八章
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11552405.html
Copyright © 2011-2022 走看看