生产者、消费者、队列

‘‘‘
queue队列,什么是队列?排队干一件事,谁去维护排队的关系?预防插队等
队列是一个有顺序的容器,有列表了还要队列干什么。
根本区别是列表里拿走一个数据,数据还在里面。队列是数据取走了就没了
为什么要用队列?提高双方效率,解耦合,生产者向队列里放,(队列),消费者从队列里取
1、先入先出 queue.Queue(maxsize=0)
queue.put()放数据
    (如果放满了再放就会阻塞,用queue.put(block=False)或q.put_nowait()抛异常,或者判断队列长度,为max就不取)
queue.get()取数据
    (如果取完了再取就会阻塞,用queue.get(block=False)或q.get_nowait()抛异常,或者判断队列长度,为0就不取)
queue.qsize()大小
queue.full()大小限制
2、后进先出queue.LifoQueue(maxsize=0)
3、存储数据时设置优先级queue.ProrityQueue(maxsize=0)
    放数据的时候排序了,queue.put((1,"alex"))改变元祖里的数字可以改顺序
‘‘‘
‘‘‘
生产者消费者模型:利用队列,生产者和消费者通过队列关联。例如web负载均衡

‘‘‘
import queue
import threading
import time

q = queue.Queue(maxsize=10)

def Producer(name):
    # 不停的向队列里生产骨头,当然可以有多个生产者
    count = 1
    while True:
        q.put("骨头{0}".format(count))
        print("生产了{0}个骨头".format(count))
        count += 1
        time.sleep(1)

def Consumer(name):
    # 不停的从队列里取骨头,当然可以有多个消费者
    while True:
        print("{0}取到{1}并且吃了它".format(name, q.get()))
        time.sleep(0.5)

p = threading.Thread(target=Producer, args=("alex",))
c1 = threading.Thread(target=Consumer, args=("张三",))
c2 = threading.Thread(target=Consumer, args=("李四",))

p.start()
c1.start()
c2.start()

原文地址:https://www.cnblogs.com/staff/p/9691647.html

时间: 2024-10-15 17:58:38

生产者、消费者、队列的相关文章

C# 实现生产者消费者队列

开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其保存在数据库中. private void FetchData() {} private void SaveData() {} static void Main(string[] args) { for (int i = 0; i < 10; i++) { FetchData(); // 获取数据 SaveData(); // 处理并保存 } } 例如上述代码例子这样顺序执行,执行会很慢,原因是获取数据和处理并保存的过

转(C# 实现生产者消费者队列)

class Program { // 任务队列 static Queue<string> _tasks = new Queue<string>(); // 为保证线程安全,使用一个锁来保护_task的访问 readonly static object _locker = new object(); // 通过 _wh 给工作线程发信号 static EventWaitHandle _wh = new AutoResetEvent(false); static Thread _wor

阻塞队列和生产者-消费者模式

阻塞队列提供了可阻塞的put和take方法.如果队列满了put将阻塞到有空间可用,如果队列为空,take将阻塞到有元素可用.队列可以是有界和无界的,无界的队列put将不会阻塞. 阻塞队列支持生产者消费者模式,该模式将找出需要完成的工作,和执行工作分开.生产者-消费者模式能简化开发过程,因为消除了生产者和消费者之间的代码依赖性,此外,该模式还将生产数据的过程和使用数据的过程解耦开来. 在基于阻塞队列构建的生产者-消费者设计中个,当数据生成时,生产者把数据放入队列,当消费者处理数据时,将从队列中获取

Java 并发编程(四)阻塞队列和生产者-消费者模式

阻塞队列 阻塞队列提供了可阻塞的 put 和 take 方法,以及支持定时的 offer 和 poll 方法.如果队列已经满了,那么put方法将阻塞直到有空间可以用:如果队列为空,那么take方法将一直阻塞直到有元素可用.队列可以使有界的,也可以是无界的,无界队列永远都不会充满,因此无界队列上的put方法永远不会阻塞.一种常见的阻塞生产者-消费者模式就是线程池与工作队列的组合,在 Executor 任务执行框架中就体现了这种模式. 意义:该模式能简化开发过程,因为他消除了生产者和消费者类之间的代

11.python并发入门(part8 基于线程队列实现生产者消费者模型)

一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据,相对的,如果消费者处理数据的速度大于生产者,那么消费者就必须等待生产者. 为了解决这种问题,就有了生产者消费者模型. 生产者与消费者模型,是通过一个容器,来解决生产者和消费者之间的耦合性问题,生产者和消费者之间并不会直接通信,这样生产者就无需等待消费者处理完数据,生产者可以直接把数据扔给队列,这个

python2.0_s12_day9之day8遗留知识(queue队列&amp;生产者消费者模型)

4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 queue非常有用,当信息必须安全的在多个线程之间进行数据交换的时候就应该想到queue 所以,queue它能保证数据被安全的在多个线程之间进行交换,那他就是天生的线程安全. queue有那么几种: class queue.Queue(maxsize=0) # 先入先出 class queue.LifoQ

#queue队列 #生产者消费者模型

1 #queue队列 #生产者消费者模型 2 3 #queue队列 #有顺序的容器 4 #程序解耦 5 #提高运行效率 6 7 #class queue.Queue(maxsize=0) #先入先出 8 #class queue.LifoQueue(maxsize=0)最后在第一 9 #class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列#VIP客户 10 11 #Queue.qsize() 12 #Queue.empty() #return

Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 参考链接http://www.cnblogs.com/alex3714/articles/5230609.html

环形缓冲区的设计及其在生产者消费者模式下的使用(并发有锁环形队列)

1.环形缓冲区 缓冲区的好处,就是空间换时间和协调快慢线程.缓冲区可以用很多设计法,这里说一下环形缓冲区的几种设计方案,可以看成是几种环形缓冲区的模式.设计环形缓冲区涉及到几个点,一是超出缓冲区大小的的索引如何处理,二是如何表示缓冲区满和缓冲区空,三是如何入队.出队,四是缓冲区中数据长度如何计算. ps.规定以下所有方案,在缓冲区满时不可再写入数据,缓冲区空时不能读数据 1.1.常规数组环形缓冲区 设缓冲区大小为N,队头out,队尾in,out.in均是下标表示: 初始时,in=out=0 队头

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把