守护模式,互斥锁,IPC通讯,生产者消费者模型
'''
1,什么是生产者消费者模型
生产者:比喻的是程序中负责产生数据的任务
消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用
实现了生产者与消费者的解耦合,生产者可以不停地生产,消费者也可以不停地消费
从而平衡了消费者地生产能力与消费能力,提升了程序整体运行地效率 什么时候用?
当我们地程序中存在明显的两类任务,一类负责产生数据,另一类负责处理数据
此时我们就应该考虑使用生产者消费者模型来提升程序地效率 '''
from multiprocessing import Queue ,Process
import time,os, random
def producer(q):
for i in range(10):
res='包子%s'%i
time.sleep(random.randint(1,3))
q.put(res)
q.put(None) def consumer(q):
while True:
res=q.get()
if res is None:break
time.sleep(random.randint(1,3))
print('%s 吃了%s'%(os.getpid(),res)) if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=(q,))
c1=Process(target=consumer,args=(q,)) p1.start()
c1.start()
print('主') ----------------------割割更健康----------------- from multiprocessing import Queue ,Process
import time,os,random def producer(name,food,q):
for i in range(3):
res='%s%s'%(food,i)
time.sleep(random.randint(1,3))
#往队列里面丢
q.put(res)
print('\033[45m%s 生产了 %s\033[0m' %(name,res)) def consumer(name,q):
while True:
#往队列里取走
res=q.get()
if res is None:break
time.sleep(random.randint(1,3))
print('\033[46m%s 吃了 %s\033[0m' %(name,res))
q.task_done()
if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=('egon','包子',q,))
p2=Process(target=producer,args=('杨军','水',q,))
p3=Process(target=producer,args=('侯老师','线',q,)) # 消费者
c1=Process(target=consumer,args=('alex',q))
c2=Process(target=consumer,args=('wupeiqidsb',q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join()
#再p1/p2/p3都结束后,才应该往队列里放结束信号,有几个消费者就应该放几个None
q.put(None) #额,给消费者发结束信号
q.put(None) print('主') # ---------------------------------终极解决方案--------------------- from multiprocessing import JoinableQueue,Process
import time,os,random def producer(name,food,q):
for i in range(3):
res='%s %s '%(food,i)
time.sleep(random.randint(1,3))
q.put(res)
print('%s 生产了%s '%(name,res)) def consumer(name,q):
while True:
res=q.get() if res is None:break
time.sleep(random.randint(1,3))
print('%s 吃了%s'%(name,res))
#向q.join()发送一次信号,证明一个数据已经被取走了
q.task_done() if __name__ == '__main__':
q=JoinableQueue()
p1=Process(target=producer,args=('egon','包子',q,))
p2=Process(target=producer,args=('严峻','泔水',q,))
p3=Process(target=producer,args=('侯老师','先',q,)) c1=Process(target=consumer,args=('alex',q,))
c2=Process(target=consumer,args=('wpx',q,))
c1.daemon=True
c2.daemon=True p1.start()
p2.start()
p3.start() c1.start()
c2.start() p1.join()
p2.join()
p3.join() q.join()#等待队列被取赶紧
#q.join()
#结束意味着主进程代码运行完毕--->>(生产者运行完毕)+队列中地数据也被取赶紧了->消费者没有存在的意义
print('主') >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ICP通讯>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
进程之间通信必须找到一种介质,该介质必须满足
1、是所有进程共享的
2、必须是内存空间
附加:帮我们自动处理好锁的问题
a、 from multiprocessing import Manager(共享内存,但要自己解决锁的问题)
b、 IPC中的队列(Queue) 共享,内存,自动处理锁的问题(最常用)
c、 IPC中的管道(Pipe),共享,内存,需自己解决锁的问题
a、 用队列Queue
1)共享的空间
2)是内存空间
3)自动帮我们处理好锁定问题
from multiprocessing import Queue
q=Queue(3) #设置队列中maxsize个数为三
q.put('first')
q.put({'second':None})
q.put('三')
# q.put(4) #阻塞。不报错,程序卡在原地等待队列中清出一个值。默认blok=True
print(q.get())
print(q.get())
print(q.get())
强调:
1、队列用来存成进程之间沟通的消息,数据量不应该过大
2、maxsize的值超过的内存限制就变得毫无意义 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>割割很健康>>>>>>>>>>>>>>>
互斥锁vs join:
大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序(在多个程序共享一个资源时,为保证有序不乱,需将并发变成串行)
区别一:join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行
区别二:互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行(详见抢票系统)
from multiprocessing import Process,Lock
import time,random
mutex=Lock()
def task1(lock):
lock.acquire()
print('task1:名字是egon')
time.sleep(random.randint(1,3))
print('task1:性别是male')
time.sleep(random.randint(1,3))
print('task1:年龄是18')
lock.release()
def task2(lock):
lock.acquire()
print('task2:名字是alex')
time.sleep(random.randint(1,3))
print('task2:性别是male')
time.sleep(random.randint(1,3))
print('task2:年龄是78')
lock.release()
def task3(lock):
lock.acquire()
print('task3:名字是lxx')
time.sleep(random.randint(1,3))
print('task3:性别是female')
time.sleep(random.randint(1,3))
print('task3:年龄是30')
lock.release()
if __name__ == '__main__':
p1=Process(target=task1,args=(mutex,))
p2=Process(target=task2,args=(mutex,))
p3=Process(target=task3,args=(mutex,))
p1.start()
p2.start()
p3.start()
一、抢票系统
import json
import time
import random
import os
from multiprocessing import Process,Lock
mutex=Lock()
def search():
time.sleep(random.randint(1,3))
with open('db.json','r',encoding='utf-8') as f:
dic=json.load(f)
print('%s 剩余票数:%s' %(os.getpid(),dic['count']))
def get():
with open('db.json','r',encoding='utf-8') as f:
dic=json.load(f)
if dic['count'] > 0:
dic['count']-=1
time.sleep(random.randint(1,3))
with open('db.json','w',encoding='utf-8') as f:
json.dump(dic,f)
print('%s 购票成功' %os.getpid())
def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
for i in range(10):
p=Process(target=task,args=(mutex,))
p.start()
一、守护进程
from multiprocessing import Process
import time
def task(name):
print('%s is running' % name)
time.sleep(3)
if __name__ == '__main__':
obj = Process(target=task, args=('egon',))
obj.daemon=True #将obj变成守护进程,主进程执行完毕后子进程跟着结束
obj.start() # 发送信号给操作系统
print('主')
守护模式,互斥锁,IPC通讯,生产者消费者模型的更多相关文章
- 守护进程,互斥锁,IPC,队列,生产者与消费者模型
小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...
- 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)
目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...
- 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
1 守护进程: 主进程 创建 守护进程 辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...
- 守护、互斥锁、IPC和生产者消费者模型
守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...
- 守护进程,进程安全,IPC进程间通讯,生产者消费者模型
1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...
- (并发编程)进程IPC,生产者消费者模型,守护进程补充
一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...
- Linux同步互斥(Peterson算法,生产者消费者模型)
同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
- Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
随机推荐
- git错误记录及解决
一.git每次提交.拉取都要输用户名和密码 问题描述:每次提交.拉取文件时都要输用户名和密码,特别麻烦 原因:在git上面注册了用户名a,然后本机安装了TortoiseGit工具,登录时会在本机C:\ ...
- 【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- tomcat用redis做session共享
在context.xml添加以下配置: <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerVa ...
- Springboot项目打包后的页面丢失问题(thymeleaf报错)
遇到的问题目前找到两种: 返回视图路径以/开头,例如 /test/hello 在thymeleaf页面中,引入的页面以/开头,例如:<footer th:replace="/index ...
- go语言使用xpath
1.导包 gopm get -g -v github.com/lestrrat-go/libxml2 2.使用示例 func ExampleHTML() { res, err := http.Get( ...
- Mysql 多实例 +表损坏
什么是实例? 进程+多个线程+预分配的内存结构 MySQL多实例: 多个进程+多个线程+多个预分配内存结构 多个配置文件: 1)多个端口 2)多个数据目录 3)多个socket文件 ./mysql_i ...
- TensorFlow object detection API
cloud执行:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_pet ...
- 让oracle数据库的表的id自动递增
1.创建递增序列 CREATE SEQUENCE ID_ADD(序列名称)INCREMENT BY 1START WITH 1MINVALUE 1NOMAXVALUE; 2.创建触发器绑定到表上cr ...
- electron 热更新
试用了下,electron 自带的热更新 并不是特别理想. 想自己处理下载更新文件.刚好看到了网上有一个比较好的处理方式.试了下效果还可以. 使用以下命令将此库包含在项目中: npm install ...
- 怎样解决if __name__ == "__main__":下面的代码没有执行的问题
很多初学者可能在用pycharm运行代码时会出现if __name__ == "__main__":下面的代码没有执行的问题,出现这类问题的原因是unittest运行姿势造成的,如 ...