zoukankan      html  css  js  c++  java
  • 多线程利器-队列(queue)

    #队列有3中模式,先进先出,先进后出,优先级
    1:先进先出
    import queue
    q = queue.Queue()     #默认是先进先出
    q.put(12)
    q.put('jack')
    q.put({'name':'ok'})
    while True:
    data = q.get()
    print(data)


    q = queue.Queue(maxsize = 2)     #队列数据只能存三个数据
    q.put(12)
    q.put('jack')
    q.put([1,2,3])
    q.put({'name':'ok'}) #存满三个数据超出后;就卡死在这,除非有另外一个线程取前面的数据

    while True:
    data = q.get()
    print(data)





    q = queue.Queue()
    q.put(12)
    q.put('jack')
    q.put([1,2,3])
    q.put({'name':'ok'},False) #False 队列满了提示报错

    while True:
    data = q.get(block=False) #False 队列取完提示报错
    print(data)

    2:先进后出(LifoQueue)
    q = queue.LifoQueue()
    q.put(12)
    q.put('jack')
    q.put([1,2,3])

    while True:
    data = q.get()
    print(data)





    3:优先级(PriorityQueue);谁小谁现出
    q = queue.PriorityQueue()

    q.put([3,12]) #列表第一个元素代表优先级
    q.put([2,'jack'])
    q.put([5,[1,2,3]])

    while True:
    data = q.get()
    print(data)

    其他一些操作:
    此包中的常用方法(q = Queue.Queue()):
    q.qsize() 返回队列的大小
    q.empty() 如果队列为空,返回True,反之False
    q.full() 如果队列满了,返回True,反之False
    q.full 与 maxsize 大小对应
    q.get([block[, timeout]]) 获取队列,timeout等待时间
    q.get_nowait() 相当q.get(False)
    非阻塞 q.put(item) 写入队列,timeout等待时间
    q.put_nowait(item) 相当q.put(item, False)
    q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
    q.join() 实际上意味着等到队列为空,再执行别的操作
    
    
    q = queue.PriorityQueue(maxsize=3)
    q.put([3,12])
    q.put([2,'jack'])
    q.put([5,[1,2,3]])

    print(q.qsize()) #队列有多少值
    print(q.empty()) #是否为空,False
    print(q.full()) #是否已经存满,如果是True(上面写了最大3个)
    q.get_nowait(22) 等价于 q.get(block=False) #22随便放的数就可以了
    q.put_nowait(22) 等价于 q.put(block=False)
     
    q.task_done() 和 q.join()示例
    import time,random
    import queue,threading

    q = queue.Queue()

    def Producer(name):
    count = 0
    while count <10:
    print("making........")
    time.sleep(2)
    q.put(count)
    print('Producer %s has produced %s baozi..' %(name, count))
    count +=1
    q.task_done() #这里面发送一个完成的信息给队里q (q.join() )
    print("ok......")
    def Consumer(name):
    count = 0
    while count <10:
    q.join() #这里面接收到队里q有完成的信息后,就接着运行下面代码,不然会一直在这卡死状态,等待上面生成完包子的信息(同理如果这是q.task_done(),就会产生吃完包子的消息,上面q.join()接收消息后接着生产)
    data = q.get()
    print('33[32;1mConsumer %s has eat %s baozi...33[0m' %(name, data))
    count +=1

    p1 = threading.Thread(target=Producer, args=('A',))
    c1 = threading.Thread(target=Consumer, args=('B',))
    c2 = threading.Thread(target=Consumer, args=('C',))
    # c3 = threading.Thread(target=Consumer, args=('D',))
    p1.start()
    c1.start()
    c2.start()
    # c3.start()




     
  • 相关阅读:
    Mysql安装
    Python的内存管理机制
    Ansible模块
    Redis持久化
    Linux——ansible(1)
    Flask
    Flask入门
    ajax处理回调函数,用ajax向后台发送数据
    数字类型钱币转换为大写
    ligerui多选动态下拉框
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9134423.html
Copyright © 2011-2022 走看看