• day52-线程-队列


    #1、线程的队列是使用import queue,如果使用from threading import Queue会报错,因为threading模块没有Queue。
    #也就是说,线程队列Queue是在queue模块里面,不在threading模块里面。
    import queue
    q = queue.Queue()
    q.put(1)
    print(q.get())
    
    #2、LifoQueue:后进先出队列
    import queue
    q = queue.LifoQueue()
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    print(q.get())
    # 3
    # 2
    # 1
    
    #3、PriorityQueue:优先级队列:值越小越优先,值相同就先进先出。
    import queue
    q = queue.PriorityQueue()
    q.put((3,'c'))
    q.put((1,'a'))
    q.put((1,'b'))
    q.put((4,'d'))
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    # (1, 'a')
    # (1, 'b')
    # (3, 'c')
    # (4, 'd')
    
    #生产者和消费者模型:
    # 4、queue模块里面有Queue这个类,Queue里面有task_done和join方法。
    # 通过下列方法让消费者线程结束:
    # 因为生产者put100个包子,而消费者get100个包子之后,消费者就吃完包子了,通过q.task_done()发信号给-->生产者,
    # q.join()接收信号之后不再阻塞,生产者线程结束-->
    # -->接着主线程t1.join()的意思是主线程随着生产者t1子线程的结束而结束-->最后消费者守护线程t2.setDaemon(True)随着主线程的结束而结束。 import queue from threading import Thread import time def producer(q): for i in range(100): q.put('包子%s' % i) q.join() def consumer(q, i): while True: print('消费者%s吃到%s' % (i, q.get())) q.task_done() q = queue.Queue(10) t1 = Thread(target=producer, args=(q,)) t1.start() for i in range(5): t2 = Thread(target=consumer, args=(q, i)) t2.setDaemon(True) t2.start() t1.join() #task_done方法在进程multiprocessing模块的JoinableQueue类里面,在线程queue模块的Queue类里面。
  • 相关阅读:
    PYTOHN1.day14
    PYTHON1.day13
    PYTHON1.day12
    PYTHON1.day11(n)
    PYTHON1.day10
    PYTHON1.day09
    PYTHON1.day08
    同步代码块 synchronized
    守护线程
    休眠线程
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142809.html
Copyright © 2020-2023  润新知