• 线程的队列,条件,定时器


    线程的队列,条件,定时器

    一、队列

    queue队列 :使用import queue,用法与进程Queue一样

    队列中封装了很多的锁,所以对于线程,队列绝对安全

    普通队列(先进先出)

    q = queue.Queue()
    q.put()
    q.get()
    q.put_nowait()
    q.get_nowait()
    

    栈(先进后出,后进先出)

    q = queue.LifoQueue()
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    '''
    3
    2
    '''
    

    优先级队列

    q = queue.PriorityQueue()
    q.put((1,'a'))
    q.put((15,'b'))
    q.put((10,'c'))
    q.put((3,'d'))
    q.put((1,'f'))
    print(q.get())
    print(q.get())
    print(q.get())
    '''
    (1, 'a')
    (1, 'f')
    (3, 'd')
    
    参数已元组形式存放
        第一个是优先级
            数字越小,优先级越高
            优先级相同,按ascii码比较
        第二个是加入队列的内容
    '''
    

    二、条件

    • 条件也是锁
    • 也有acquire和release
    • 一个条件被创建,默认有一个False状态
    • False状态会影响wait一直处于等待状态
    • notify(int数据类型) 指定造钥匙的数量
    • notify和wait必须在acquire和release之间
    from threading import Thread,Condition
    con = Condition()
    
    def func(con,i):
        con.acquire()
        con.wait() # 等钥匙  阻塞
        print(f'我在第{i}个线程里')
        con.release()
    
    # 创建线程
    s = 10
    for i in range(s):
        Thread(target=func,args=(con,i)).start()
    
    # 循环造钥匙,超过线程总数便停止
    while True:
    
        num = int(input('>>>>>>>'))
        import time
        con.acquire()
        con.notify(num)  # 造钥匙
        con.release()
        time.sleep(0.5)
    '''
    >>>>>>>3
    我在第1个线程里
    我在第0个线程里
    我在第2个线程里
    >>>>>>>4
    我在第6个线程里
    我在第4个线程里
    我在第5个线程里
    我在第3个线程里
    >>>>>>>5
    我在第9个线程里
    我在第8个线程里
    我在第7个线程里
    >>>>>>>2
    >>>>>>>
    '''
    

    三、定时器

    给线程的开启加了定时器,限定线程在指定时间后开启

    from threading import Timer
    import datetime
    import time
    def func():
        print(datetime.datetime.now())
    
    while True:
        Timer(2,func).start()  # 让创建的线程间隔一段时间才执行
        print('休息中......')
        time.sleep(2)
    '''
    休息中......
    2019-09-18 20:55:25.158692
    休息中......
    2019-09-18 20:55:27.158931
    休息中......
    2019-09-18 20:55:29.159125
    休息中......
    '''
    
  • 相关阅读:
    Git&GitHUP总结
    SpringBoot 与任务
    SpringBoot中Scheme的使用
    SpringBoot的错误处理机制
    thymeleaf公共页面元素抽取
    redis 配置文件介绍 redis.conf
    SpringBoot如何实现国际化
    AttributeError: 'str' object has no attribute 'lowerr' Python常见错误
    TypeError: 'list' object cannot be interpreted as an integer Python常见错误
    TypeError: myMethod() takes no arguments (1 given) Python常见错误
  • 原文地址:https://www.cnblogs.com/dadazunzhe/p/11545533.html
Copyright © 2020-2023  润新知