• 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 '''
  • 相关阅读:
    git 更新代码
    jmeter 线程组之间传递动态变化的变量值
    MYSQL 使用存储过程批量更新表数据
    linux查看日志中特定字符串以及前后信息内容命令
    导出表结构 字段说明
    转 awk统计nginx每天访问最高的接口
    MySQL 同一字段匹配多个值
    Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)
    转 Xshell ssh长时间连接不掉线设置
    Vs.net 常用命令行
  • 原文地址:https://www.cnblogs.com/yoyovip/p/5795287.html
Copyright © 2020-2023  润新知