生产者消费者模型   主要是为解耦   借助队列来实现生产者消费者模型

   栈:先进后出(First In Last Out       简称 FILO)   队列: 先进先出(First In First Out   简称 FIFO)

import queue  # 不能进行多进程之间的数据传输(1)from multiprocessing import Queue   借助Queue解决生产者消费者模型   队列是安全的。   q = Queue(num)   num : 队列的最大长度   q.get()# 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待   q.put()# 阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待

   q.get_nowait()# 不阻塞,如果有数据直接获取,没有数据就报错   q.put_nowait()# 不阻塞,如果可以继续往队列中放数据,就直接放,不能放就报错代码:
from multiprocessing import Queue,Processimport time

def consumer(q,name):    while 1:        info = q.get()        if info:            print('%s 拿走了%s'%(name,info))        else:# 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识            break# 此时消费者结束即可

# 消费者如何判断,生产者是没来得及生产数据,还是生产者不再生产数据了?# 如果你尝试用get_nowait() + try 的方式去尝试获得生产者不再生产数据,此时是有问题的。

def producer(q,product):    for i in range(20):        info = product + '的娃娃%s号'%str(i)        q.put(info)    q.put(None)# 让生产者生产完数据后,给消费者一个不再生产数据的标识

if __name__ == '__main__':    q = Queue(10)    p_pro = Process(target=producer,args=(q,'岛国米饭保你爱'))    p_con = Process(target=consumer,args=(q,'alex'))    p_pro.start()    p_con.start()

###############################################  将生产者生产结束的标识,放到父进程中

from multiprocessing import Queue,Processimport time

def consumer(q,name,color):    while 1:        info = q.get()        if info:            print('%s %s 拿走了%s \033[0m'%(color,name,info))        else:# 当消费者获得队列中数据时,如果获得的是None,就是获得到了生产者不再生产数据的标识            break# 此时消费者结束即可

# 消费者如何判断,生产者是没来得及生产数据,还是生产者不再生产数据了?# 如果你尝试用get_nowait() + try 的方式去尝试获得生产者不再生产数据,此时是有问题的。

def producer(q,product):    for i in range(20):        info = product + '的娃娃%s号'%str(i)        q.put(info)

if __name__ == '__main__':    q = Queue(10)    p_pro1 = Process(target=producer,args=(q,'岛国米饭保你爱'))    p_pro2 = Process(target=producer,args=(q,'苍老师版'))    p_pro3 = Process(target=producer,args=(q,'波多多版'))    p_con1 = Process(target=consumer,args=(q,'alex','\033[31m'))    p_con2 = Process(target=consumer,args=(q,'wusir','\033[32m'))    p_l = [p_con1,p_con2,p_pro1,p_pro2,p_pro3]    [i.start() for i in p_l]    # 父进程如何感知到生产者子进程不再生产数据了?    p_pro1.join()    p_pro2.join()    p_pro3.join()    q.put(None)# 几个消费者就要接受几个结束标识    q.put(None)

(2)from multiprocessing import JoinableQueue#可连接的队列   JoinableQueue是继承Queue,所以可以使用Queue中的方法   并且JoinableQueue又多了两个方法   q.join()# 用于生产者。等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据   q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。代码:
from multiprocessing import Process,JoinableQueue

q = JoinableQueue()

q.join()# 用于生产者。等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。

假设生产者生产了100个数据,join就能记录下100这个数字。每次消费者消费一个数据,就必须要task_done返回一个标识,当生产者(join)接收到100个消费者返回来的标识的时候,生产者就能知道消费者已经把所有数据都消费完了。

from multiprocessing import Queue,Processimport time

def consumer(q,name,color):    while 1:        info = q.get()        print('%s %s 拿走了%s \033[0m'%(color,name,info))        q.task_done()

def producer(q,product):    for i in range(20):        info = product + '的娃娃%s号'%str(i)        q.put(info)    q.join()# 记录了生产了20个数据在队列中,此时会阻塞等待消费者消费完队列中所有数据

if __name__ == '__main__':    q = JoinableQueue(10)    p_pro = Process(target=producer,args=(q,'岛国米饭保你爱'))    p_con = Process(target=consumer,args=(q,'alex','\033[31m'))    p_con.daemon = True# 把消费者进程设为守护进程    p_con.start()    p_pro.start()    p_pro.join()# 主进程等待生产者进程结束    程序有3个进程,主进程和生产者进程和消费者进程。  当主进程执行到35行代码时,主进程会等待生产进程结束    而生产进程中(第26行)会等待消费者进程把所有数据消费完,生产者进程才结束。    现在的状态就是  主进程等待生产者进程结束,生产者进程等待消费者消费完所有数据    所以,把消费者设置为守护进程。  当主进程执行完,就代表生产进程已经结束,也就代表消费者进程已经把队列中数据消费完    此时,主进程一旦结束,守护进程也就是消费者进程也就跟着结束。    整个程序也就能正常结束了。
 

生产者消费者模型(Queue,JoinableQueue)的更多相关文章

  1. 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue

    1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...

  2. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

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

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

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

    #queue队列 #生产者消费者模型 #queue队列 #有顺序的容器 #程序解耦 #提高运行效率 #class queue.Queue(maxsize=0) #先入先出 #class queue.L ...

  5. Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)

    八:事件(Event()) # 阻塞事件:    e = Event() 生成事件对象e    e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...

  6. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  7. joinablequeue模块 生产者消费者模型 Manager模块 进程池 管道

    一.生产者消费者 主要是为解耦(借助队列来实现生产者消费者模型) import queue  # 不能进行多进程之间的数据传输 (1)from multiprocessing import Queue ...

  8. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  9. Python守护进程、进程互斥锁、进程间通信ICP(Queue队列)、生产者消费者模型

    知识点一:守护进程 守护进程:p1.daemon=True 守护进程其实就是一个“子进程“,守护=>伴随 守护进程会伴随主进程的代码运行完毕后而死掉 进程:当父进程需要将一个任务并发出去执行,需 ...

随机推荐

  1. ftp添加虚拟用户的实例

    本文主要讲解添加一个ftp虚拟用户的流程,接上文 https://www.cnblogs.com/tssc/p/9582780.html ========= 完美的分割线 ======== 1.修改授 ...

  2. 蓝桥杯 ALGO-1:区间k大数查询

      算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB        问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个 ...

  3. Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  4. (研)for循环的一个bug以及3个while循环的快排

    在这个for循环中,只要有一次不满足,这个for循环将break掉 while(p->score>=90&&i<5) count++ //若有一次不满足的话,那么整个 ...

  5. solr学习三(测试类,含普通与ExtractingRequestHandler测试)

    solr客户端基本是配置出来的,服务端可以对其进行测试,我使用的是solrj服务端. 如果初学solr,先使用普通的测试类: import java.io.IOException; import ja ...

  6. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...

  7. Codeforces Round #243 (Div. 2)——Sereja and Swaps

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012476429/article/details/24665103 题目链接 题意: 给定一个整数 ...

  8. TensorFlow笔记-05-反向传播,搭建神经网络的八股

    TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...

  9. linux修改文件所有者和文件所在组

      chgrp  用户名    文件名  -R chown 用户名   文件名  -R -R表示递归目录下所有文件 以上部分已验证 一.修改文件所属组群——chgrp    修改文件所属组群很简单-c ...

  10. 添加pptp、l2tp客户端

    一.编译 -> Network -> Network ->VPN 二.配置 1. L2TP配置 network配置文件增加: config interface 'vpn1' opti ...