#1、队列的数据是安全的,因为队列内置了一把锁,大家都来抢占资源的时候,A在操作数据的时候,B就无法操作该数据。
# 下面代码有两个生产者和三个消费者,包子吃完之后,接着放的两个None被marry和alex吃到了,所以吃饱了,剩下的牛奶,tom吃完。
# 放在队列里面的None的数量需要根据生产者和消费者的数量来计算,很不方便。
from multiprocessing import Process
from multiprocessing import Queue
import time
import random
def producer(q,food):
for i in range(5):
time.sleep(random.random())
q.put('%s-%s'%(food,i))
print('%s-%s'%(food,i))
q.put(None) #因为有三个消费者,需要三个None才能让consumer方法的循环结束。
q.put(None) #两个生产者有4个None def consumer(q,name):
while True: #消费者要处理多少数据是不确定的,所以使用while循环。
food = q.get()
if food == None:
print('%s吃饱了'%name)
break #while是无法结束的,所以需要生产者发送None信号。这个信号的数量
print('%s吃了%s'%(name,food))#是根据生产者和消费者的数量来计算的,所以很不方便。 if __name__ == '__main__':
q = Queue()
p = Process(target=producer,args=(q,'包子'))
p.start()
p1 = Process(target=producer,args=(q,'牛奶'))
p1.start()
c = Process(target=consumer,args=(q,'alex'))
c.start()
c1 = Process(target=consumer,args=(q,'marry'))
c1.start()
c2 = Process(target=consumer,args=(q,'tom'))
c2.start()
# 牛奶-0
# alex吃了牛奶-0
# 包子-0
# tom吃了包子-0
# 包子-1
# marry吃了包子-1
# 包子-2
# alex吃了包子-2
# 牛奶-1
# tom吃了牛奶-1
# 包子-3
# marry吃了包子-3
# 牛奶-2
# alex吃了牛奶-2
# 包子-4
# tom吃了包子-4
# marry吃饱了
# alex吃饱了
# 牛奶-3
# tom吃了牛奶-3
# 牛奶-4
# tom吃了牛奶-4
# tom吃饱了 #2、使用JoinableQueue(数据也是安全的),避免计算None的信号数量的麻烦:
#流程:数据全部被消费--->生产进程结束--->主进程结束--->消费守护进程结束。
from multiprocessing import Process
from multiprocessing import JoinableQueue
import time
import random
def producer(q,food):
for i in range(5):
time.sleep(random.random())
q.put('%s-%s'%(food,i))
print('%s-%s'%(food,i))
q.join() #等待数据全部被消费,当包子和牛奶全部被吃完,下面的q.task_done()会发送完成的信号给q.join(),
#q.join()收到信号之后,就不再阻塞,这样这个生产的进程就结束了。 def consumer(q,name):
while True:
food = q.get()
print('%s吃了%s'%(name,food))
q.task_done() if __name__ == '__main__':
q = JoinableQueue()
p = Process(target=producer,args=(q,'包子'))
p.start()
p1 = Process(target=producer,args=(q,'牛奶'))
p1.start()
c = Process(target=consumer,args=(q,'alex'))
c.daemon = True
c.start()
c1 = Process(target=consumer,args=(q,'marry'))
c1.daemon = True
c1.start()
c2 = Process(target=consumer,args=(q,'tom'))
c2.daemon = True
c2.start()#p.join()和p1.join(),阻塞等待,主进程等待子进程结束之后才结束。
p.join() #生产的进程结束以后,p.join()和p1.join()也结束了,那么if语句下面的主进程都结束了,
p1.join()#接着消费者作为守护进程也随着主进程的结束而结束(循环结束)。这样就不需要计算None的信号数量了。 #3、func因为睡眠了1秒,陷入阻塞,系统会让func1先执行,然后func才执行。
from multiprocessing import Process
import time def func():
time.sleep(1)
print('') def func1():
print('') if __name__ == '__main__':
p = Process(target=func)
p.start()
p1 = Process(target=func1)
p1.start()
#
# #4、因为设置了队列,就算func设置了睡眠1秒,也不会阻塞:
from multiprocessing import Process
from multiprocessing import Queue
import time def func(q):
time.sleep(1)
q.put('')
print('get1') def func1(q):
print(q.get())
print('') if __name__ == '__main__':
q = Queue()
p = Process(target=func,args=(q,))
p.start()
p1 = Process(target=func1,args=(q,))
p1.start()
# get1
#
#

day40-进程-生产者消费者模型进阶的更多相关文章

  1. 利用multiprocessing.managers开发跨进程生产者消费者模型

    研究了下multiprocessing.managers,略有收获,随笔一篇: 核心思路是构造一个manager进程,这个进程可以通过unix socket或tcp socket与其它进程通信:因为利 ...

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

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

  3. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

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

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

  5. 进程部分(IPC机制及生产者消费者模型)和线程部分

    进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...

  6. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  7. Python_生产者消费者模型、管道、数据共享、进程池

    1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...

  8. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

  9. Learning-Python【34】:进程之生产者消费者模型

    一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...

随机推荐

  1. Redis的学习之路

    应用场景 1.作为缓存使用  (1)原始业务功能设计 秒杀 双十一.618 排队购票 (2)运营平台察觉到突发式高频访问热点 突发式热点新闻 (3)高频复杂的统计数据 在线直播 投票排行榜 2.附加功 ...

  2. 题解 P1220 【关路灯】

    区间DP, 考虑设\(dp[i][j][t]\)为已经关掉了\([i,j]\)的电灯, 人在t端点处时的最小代价 可以推出方程: \[ dp[i+1][j][0]+(p[n]-p[j]+p[i])*( ...

  3. java 简单的冒泡

    import java.util.Arrays; public class mao { public static void main(String[] args) { int [] array={1 ...

  4. 洛谷 P1018乘积最大

    题目描述 今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 ...

  5. SQL基础教程(第2版)第1章 数据库和SQL

    ● 数据库有很多种类,本书将介绍如何使用专门的 SQL语言来操作关系数据库.● 关系数据库通过关系数据库管理系统(RDBMS)进行管理. 根据 SQL 语句的内容返回的数据同样必须是二维表的形式,这也 ...

  6. sync实现windows与nginx主机端文件同步(参考文档)

    资源 Rsync官网:http://rsync.samba.org/ 简介 Rsync(remote sync)是类unix系统下的远程(LAN/WAN)数据镜像备份工具.可以实现Linux与linu ...

  7. idea使用eclipse风格

    说明,只是代码编辑区采用eclipse风格,其他用的是idea的IntelliJ(白色风格) 1.下载文件 2.配置

  8. Fiddler 断点命令

    Request 断点:bpu /priceCalculate 清除命令:bpu Response 断点:bpafter /priceCalculate 清除命令:bpafter

  9. Java 进制转换(二进制(负),八进制,十进制,十六进制),位运算、逻辑运算(2)

    负数的二进制表现形式:其实就是该数的绝对值取反+1. 进制转换(二进制,八进制,十进制,十六进制),原理解析 十六进制的表现形式: (2)(与.异或.左移.右移.三元运算符)

  10. Anaconda 添加清华源与恢复默认源

    1.添加清华源 查看清华大学官方镜像源文档:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 本文基于Windows平台,首先用命令: conda ...