day40-进程-生产者消费者模型进阶
#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-进程-生产者消费者模型进阶的更多相关文章
- 利用multiprocessing.managers开发跨进程生产者消费者模型
研究了下multiprocessing.managers,略有收获,随笔一篇: 核心思路是构造一个manager进程,这个进程可以通过unix socket或tcp socket与其它进程通信:因为利 ...
- Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)
Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- 进程部分(IPC机制及生产者消费者模型)和线程部分
进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- Python_生产者消费者模型、管道、数据共享、进程池
1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...
- python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)
#######################总结######### 主要理解 锁 生产者消费者模型 解耦用的 队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...
- Learning-Python【34】:进程之生产者消费者模型
一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...
随机推荐
- Ubuntu16.04 faster-rcnn+caffe+gpu运行环境配置以及解决各种bug
https://blog.csdn.net/flygeda/article/details/78638824 本文主要是对近期参考的网上各位大神的博客的总结,其中,从安装系统到跑通程序过程中遇到的各种 ...
- 阿里云服务器搭建详解——Ubuntu
由于自己电脑配置跟不上,双系统一开,整个电脑就会变得非常卡顿,所以决定在阿里云买一个云服务器.听朋友说,学生买的话是非常便宜的,比每月开个SVIP还便宜.今天上网看了下,果然如此,每月只要9.9,确实 ...
- Codeforces Round #599 (Div. 2) Tile Painting
题意:就是给你一个n,然后如果 n mod | i - j | == 0 并且 | i - j |>1 的话,那么i 和 j 就是同一种颜色,问你最大有多少种颜色? 思路: 比赛的时候,看到 ...
- Codeforces 997A Convert to Ones(思维)
https://codeforces.com/problemset/problem/997/A 题目大意: 给定一串0-1序列,定义两种操作: 操作一:选取一连续串倒置. 操作二:选取一连续串把进行0 ...
- 201771010123汪慧和《面向对象程序设计Java》第十一周实验总结
一.理论部分 1.栈 (1)栈是一种特殊的线性表,是一种后进先出的结构.(2)栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶,表头称为栈底.(3)栈的物理存储可以用顺序存储结构,也可以用链式 ...
- 2019年春PAT甲级考试
这次考试不是很理想,一道题目没能做完. 自己原因差不多三条: 1.自己实力不够,准备时间也有点仓促,自己没能做到每道题目都有清晰的思路. 2.考试的心理素质不行,因为设备原因东奔西跑浪费了挺多时间,自 ...
- vue项目 首页开发 part3
da当拖动图标时候,只有上部分可以,下部分无响应 swiper 为根页面引用,其中的css为独立,点击swiper标签可以看见其包裹区域只有部分 那么需要修改 就需要穿透样式 外部 >> ...
- Java 知识点(一)
博主对 Java知识点的整理基于 c语言,整理内容为 Java的重点及与 c语言的差异点或编程通要知识点.水平有限,欢迎指正.(参考书籍<Java 核心技术 卷Ⅰ>) Java 的类名:名 ...
- InnoDB和MyISAM区别总结
原来是MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等 ...
- RepeatSubmitInterceptor extends HandlerInterceptorAdapter
package com.ruoyi.framework.interceptor; import java.lang.reflect.Method; import javax.servlet.http. ...