zoukankan      html  css  js  c++  java
  • Queue与生产者消费者模型

    queue,队列是线程间最常用的交换数据的形式,当信息必须在多个线程之间安全交换的时候,队列在线程编程是特别有用的。

    1.创建一个队列

    import queue

    q = queue.Queue(maxsize=5) #队列最多3个,先入先出

    q = queue.LifoQueue(maxsize=3) #先入后出

    q = queue.PriorityQueue(maxsize=0#存储数据时可设置优先级的队列

    通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限

    2.常用操作

    q.put(1)  #向队列中放值

    q.get()  #从队列中取值

    q.qsize() 返回队列的大小

    q.empty() 如果队列为空,返回True,反之False

    q.full() 如果队列满了,返回True,反之False

    q.get([block[, timeout]]) 获取队列,timeout等待时间

    q.get_nowait() 相当q.get(False)

    q.put_nowait(item) 相当q.put(item, False)

    q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号

    q.join() 实际上意味着等到队列为空,再执行别的操作

    生产者消费者模型

     1 import threading,queue
     2 import time
     3 
     4 def consumer(n):
     5     while True:
     6         print("33[32;1mconsumer [%s]33[0m get task: %s" %(n,q.get()))
     7         time.sleep(1)
     8         q.task_done()  #发出一个任务完成的信号
     9 def producer(n):
    10     count = 1
    11     while True:
    12         #time.sleep(1)
    13         #if q.qsize() < 3:
    14         print("prodcer [%s] produced a new task : %s" %(n,count))
    15         q.put(count)
    16         count += 1
    17         q.join()  #等待队列为空
    18         print("all taks has been cosumed by consumers...")
    19 
    20 q = queue.Queue()
    21 c1 = threading.Thread(target=consumer,args=[1,])
    22 c2 = threading.Thread(target=consumer,args=[2,])
    23 c3 = threading.Thread(target=consumer,args=[3,])
    24 p = threading.Thread(target=producer,args=["nima",])
    25 p2 = threading.Thread(target=producer,args=["nimei",])
    26 c1.start()
    27 c2.start()
    28 c3.start()
    29 p.start()
    30 p2.start()
    31 ''' 32 输出结果 33 prodcer [xiaoyu] produced a new task : 1 34 consumer [1] get task: 1 35 prodcer [yaoguo] produced a new task : 1 36 consumer [2] get task: 1 37 all taks has been cosumed by consumers... 38 all taks has been cosumed by consumers... 39 prodcer [xiaoyu] produced a new task : 2 40 prodcer [yaoguo] produced a new task : 2 41 consumer [3] get task: 2 42 consumer [2] get task: 2 43 '''
  • 相关阅读:
    在MonoTouch中自定义表格 狼人:
    Android开发进阶:如何读写Android文件 狼人:
    Windows Phone 7 开发之:工具栏 狼人:
    Android平台Qt开发入门教程 狼人:
    PySide中的信号和槽 狼人:
    sql server 2005 通过代理定时备份数据库
    Java I/O流操作(三)File文件操作及打印流和序列流合并流
    分别介绍以下数据提供者连接各种数据库的方法 (vb.net)
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    软件架构设计之Utility模块——string
  • 原文地址:https://www.cnblogs.com/yoyovip/p/5795287.html
Copyright © 2011-2022 走看看