zoukankan      html  css  js  c++  java
  • 队列 栈 事件

    线程队列

    FIFO队列

    # 1 FIFO队列 queue 先进先出 特殊参数 block=True, timeout=None
    import queue
    # q=queue.Queue(3)
    # q.put(666)
    # q.put(777)
    # q.put(888)
    # print(q.get())
    # print(q.get())
    # print(q.get())
    

    LIFO 栈

    # LIFO 栈. 先进后出 特殊参数 block=True, timeout=None
    import queue
    # q=queue.LifoQueue(3)
    # q.put(666)
    # q.put(777)
    # q.put(888)
    # print(q.get())
    # print(q.get())
    # print(q.get())
    

    优先级队列

    # 优先级对列 需要元组的形式,(int,数据) int 代表优先级,数字越低,优先级越高. get先去重要的
    import queue
    q=queue.PriorityQueue(3)
    q.put((10,'拉级消息'))
    q.put((-10,'重要消息'))
    q.put((5,'一般消息'))
    print(q.get())
    print(q.get())
    print(q.get())
    

    事件Event

    使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

    并发的执行某个任务 .多线程多进程,几乎同时执行.

    一个线程执行到中间时遇到事件event通知另一个线程开始执行.

    属性

    # event = Event()  # 默认是False
    # event.set()  # 改成了True
    # event.wait()  # 轮询检测event是否为True,当其为True,继续下一行代码. 阻塞.
    # event.wait(1)
    # 设置超时时间,如果1s中以内,event改成True,代码继续执行.
    # 设置超时时间,如果超过1s中,event没做改变,代码继续执行.
    print(event.is_set()) 查询状态
    

    第一版 没用 Event版

    # 引入 
    import time
    from threading import Thread
    from threading import current_thread
    flag = False
    def task():
        print(f'{current_thread().name} 检测服务器是否正常开启....')
        time.sleep(3)
        global flag
        flag = True
    
    def task1():
        while 1:
            time.sleep(1)
            print(f'{current_thread().name} 正在尝试连接服务器.....')
            if flag:
                print('连接成功')
                return
    
    if __name__ == '__main__':
        for i in range(4):
            t=Thread(target=task,)
            t.start()
        t4=Thread(target=task1,)
        t4.start()
    

    第2版用了 Event

    import time
    from threading import Thread
    from threading import current_thread
    from threading import Event
    def task():
        print(f'{current_thread().name} 检测服务器是否正常开启....')
        time.sleep(3)
        event.set()
    
    def task1():
        while 1:
            time.sleep(1)
            print(f'{current_thread().name} 正在尝试连接服务器.....')
            event.wait()
            print(f'{current_thread().name} 连接成功')
    
    if __name__ == '__main__':
        event = Event()
        for i in range(4):
            t=Thread(target=task,)
            t.start()
        t4=Thread(target=task1,)
        t4.start()
    
    

    小列题

     一个线程监测服务器是否开始,
     另个一线程判断如果开始了,则显示连接成功,此线程只尝试连接3次,1s 一次,如果超过3次,还没有连接成功,则显示连接失败.
    from threading import Thread
    from threading import Event
    from threading import current_thread
    import time
    event=Event()
    def check():
        print(f'{current_thread().name}监测服务器是否开启')
        time.sleep(3)
        event.set()
        print(f'服务器已经开启...')
    def connect():
        print(f'{current_thread().name}等待连接。。。')
        count=1
        while 1:
            event.wait(1)
            if count==4:
                print('机会没了')
                break
            if event.is_set():
                print(f'{current_thread().name}连接成功')
                break
            else:
                print(f'{current_thread().name}连接失败还有{3-count}次机会')
                count+=1
    t1=Thread(target=check)
    t2=Thread(target=connect)
    t1.start()
    t2.start()
    
    
  • 相关阅读:
    装饰者模式和适配器模式
    java 中获得 资源文件方法
    在windows 上统计git 代码量
    Linux-静态库生成
    Redis-Redi事务注意事项
    Linux-使用 yum 升级 gcc 到 4.8
    Linux-配置虚拟IP
    PHP-PSR-[0-4]代码规范
    Linux-/etc/rc.local 或 service 中使用 sudo -u xxx cmd 执行失败(sorry, you must have a tty to run sudo)解决办法
    Linux-系统负载
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12388504.html
Copyright © 2011-2022 走看看