4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
一、守护进程
import random
import time
from multiprocessing import Process def task():
print('name: egon')
time.sleep(random.randint(0,3))
print('sex:male')
time.sleep(random.randint(0, 3))
print('age:19') if __name__ == '__main__':
p=Process(target=task)
p.daemon() #将p设置为主进程的守护进程,主进程结束,无论子进程是否正常执行完,都跟主进程一起结束
二、互斥锁
互斥锁:
强调:必须是lock.acquire()一次,然后 lock.release()释放一次,才能继续lock.acquire(),不能连续的lock.acquire()
互斥锁vs join的区别:
大前提:
二者的原理都是一样,都是将并发变成串行,从而保证有序
区别:
一、join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行
二、 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行
1 from multiprocessing import Process,Lock
2 import time,random
3
4 mutex=Lock()
5 # 互斥锁:
6 #强调:必须是lock.acquire()一次,然后 lock.release()释放一次,才能继续lock.acquire(),不能连续的lock.acquire()
7
8 # 互斥锁vs join的区别一:
9 # 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序
10 # 区别:# 互斥锁vs join的区别:
11 # 大前提:二者的原理都是一样,都是将并发变成串行,从而保证有序
12 # 区别:一、join是按照人为指定的顺序执行,而互斥锁是所以进程平等地竞争,谁先抢到谁执行
13 # 二、 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行
14
15 def task1(lock):
16 lock.acquire() #抢锁
17 print('task1:名字是egon')
18 time.sleep(random.randint(1,3))
19 print('task1:性别是male')
20 time.sleep(random.randint(1,3))
21 print('task1:年龄是18')
22 lock.release() #释放锁
23
24 def task2(lock):
25 lock.acquire()
26 print('task2:名字是alex')
27 time.sleep(random.randint(1,3))
28 print('task2:性别是male')
29 time.sleep(random.randint(1,3))
30 print('task2:年龄是78')
31 lock.release()
32
33
34 def task3(lock):
35 lock.acquire()
36 print('task3:名字是lxx')
37 time.sleep(random.randint(1,3))
38 print('task3:性别是female')
39 time.sleep(random.randint(1,3))
40 print('task3:年龄是30')
41 lock.release()
42
43
44
45 if __name__ == '__main__':
46 p1=Process(target=task1,args=(mutex,))
47 p2=Process(target=task2,args=(mutex,))
48 p3=Process(target=task3,args=(mutex,))
49
50 # p1.start()
51 # p1.join()
52 # p2.start()
53 # p2.join()
54 # p3.start()
55 # p3.join()
56
57 p1.start()
58 p2.start()
59 p3.start()
互斥锁应用
1 from multiprocessing import Process,Lock
2 import time,json,random,os
3
4 lock=Lock()
5 def search():
6 print('========%s 查票======' % os.getpid())
7 info=json.load(open('test.txt'))
8 msg='余票为: %s'%info['count']
9 print(msg)
10
11 def get(lock):
12 lock.acquire()
13 print('========%s 抢票======'%os.getpid())
14 info = json.load(open('test.txt'))
15 time.sleep(random.random())
16 if info['count']>0:
17 info['count']-=1
18 time.sleep(random.random())
19 json.dump(info,open('test.txt','w'))
20 print('抢票成功')
21 else:
22 print('票已售完')
23 lock.release()
24
25 def op(lock):
26 search()
27 get(lock)
28
29 if __name__ == '__main__':
30 for i in range(0,50):
31 p=Process(target=op,args=(lock,))
32 p.start()
模拟抢票系统
三、IPC通信(进程之间的的通信控制)
进程之间通信必须找到一种介质,该介质必须满足
- 是所有进程共享的
- 必须是内存空间
- 附加:帮我们自动处理好锁的问题
1、队列(推荐使用)
- 共享的空间
- 是内存空间
- 自动帮我们处理好锁定问题
强调:
1、队列用来存成进程之间沟通的消息,数据量不应该过大
2、maxsize的值超过的内存限制就变得毫无意义
from multiprocessing import Queue q=Queue(3) #创建队列,并为队列设置大小 此处为3
q.put('first')
q.put({'second':None}) #可以存放任意类型
q.put('三') # q.put(4) #队列存满,第四个存不进,阻塞,等待别的进程取出队列中内容 print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 阻塞 ,队列为空,取不出东西,等待其他进程往队列中存放东西
p.put('first',block=False,timeout=4)
p.get('first',block=False,timeout=4)
#第一个参数 是存放到队列中的数据
#第二个参数block ,是否进入阻塞状态,当队满存值或队空取值时,默认值为True
#第三个参数timeout ,当队满存值或队空取值时,阻塞等待的时间,若超过时间则报错
2、Manager
没有处理好锁问题,不推荐使用
from multiprocessing import Process,Manager,Lock
import time mutex=Lock() def task(dic,lock):
lock.acquire()
temp=dic['num']
time.sleep(0.1)
dic['num']=temp-1
lock.release() if __name__ == '__main__':
m=Manager() #创建一个共享空间
dic=m.dict({'num':10}) l=[]
for i in range(10):
p=Process(target=task,args=(dic,mutex))
l.append(p)
p.start() for p in l:
p.join()
print(dic)
3、管道(不推荐使用)
- 是所有进程共享的
- 是内存空间
- 两头存取数据
- 没有帮我们自动处理好锁的问题
四、生产者消费者模型
该模型中包含两类重要的角色:
1、生产者:将负责造数据的任务比喻为生产者
2、消费者:接收生产者造出的数据来做进一步的处理,该类人物被比喻成消费者
实现生产者消费者模型三要素
1、生产者
2、消费者
3、队列
什么时候用该模型:
程序中出现明显的两类任何,一类任务是负责生产,另外一类任务是负责处理生产的数据的
该模型的好处:
1、实现了生产者与消费者解耦和
2、平衡了生产力与消费力,即生产者可以一直不停地生产,消费者可以不停地处理,因为二者
不再直接沟通的,而是跟队列沟通
1 import time
2 import random
3 from multiprocessing import Process,Queue
4
5 def consumer(name,q):
6 while True:
7 res=q.get()
8 time.sleep(random.randint(1,3))
9 print('\033[46m消费者===》%s 吃了 %s\033[0m' %(name,res))
10
11
12 def producer(name,q,food):
13 for i in range(5):
14 time.sleep(random.randint(1,2))
15 res='%s%s' %(food,i)
16 q.put(res)
17 print('\033[45m生产者者===》%s 生产了 %s\033[0m' %(name,res))
18
19
20 if __name__ == '__main__':
21 #1、共享的盆
22 q=Queue()
23
24 #2、生产者们
25 p1=Process(target=producer,args=('egon',q,'包子'))
26 p2=Process(target=producer,args=('刘清政',q,'泔水'))
27 p3=Process(target=producer,args=('杨军',q,'米饭'))
28
29 #3、消费者们
30 c1=Process(target=consumer,args=('alex',q))
31 c2=Process(target=consumer,args=('梁书东',q))
32
33
34 p1.start()
35 p2.start()
36 p3.start()
37 c1.start()
38 c2.start()
生产者消费者模式
4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型的更多相关文章
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- 5月25日 python学习总结 HTML标签
一.HTML简介 http://www.cnblogs.com/linhaifeng/articles/8973878.html 二.HTML标签与文档结构 http://www.cnblogs.c ...
- 4月26日 python学习总结 JoinableQueue、线程、三种锁
一.进程队列补充-创建进程队列的另一个类JoinableQueue JoinableQueue同样通过multiprocessing使用. 创建队列的另外一个类: JoinableQueue([max ...
- Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- Python3学习之路~9.4 队列、生产者消费者模型
一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
- 4月2日 python学习总结
昨天内容回顾: 1.迭代器 可迭代对象: 只要内置有__iter__方法的都是可迭代的对象 既有__iter__,又有__next__方法 调用__iter__方法==>得到内置的迭代器对象 调 ...
- 4月8日 python学习总结 模块与包
一.包 #官网解释 Packages are a way of structuring Python's module namespace by using "dotted module n ...
随机推荐
- 四路4 GSPS@ 12 bit,四路12 GSPS@16 位4T4R 射频芯片AD9988
一.产品概述 AD9988 是一款高度集成的套件,是北京太速最新研发的,具有四个 16 位.12 GSPS 最大采样率.RF 数模转换器 (DAC) 内核,以及四个 12 位.4 GSPS 速率.RF ...
- Note -「最大团-最小度不等式」
这是什么奇怪的名字qwq. 一些定义 只为便于理解,没有苛求专业的定义. 简单无向图:不存在重边.自环的无向图. \(\delta(G)\):无向图 \(G\) 中结点的最小度数.即 \(\m ...
- Solution -「AGC 019F」「AT 2705」Yes or No
\(\mathcal{Description}\) Link. 有 \(n+m\) 个问题,其中 \(n\) 个答案为 yes,\(m\) 个答案为 no.每次你需要回答一个问题,然后得知这个 ...
- 用 Beep 函数让主板“唱”《生日歌》
用 Beep 函数,让你的主板也会"唱歌".Beep 可以通过控制主板扬声器的发声频率和节拍来演奏美妙的旋律.本文就通过C#演示,调用Beep函数,演奏生日快乐歌.首先我们来看下 ...
- linux服务器登录微信报警通知
linux服务器ssh登录安全规则中,理论上要做到:防火墙限制,hosts.allow限制,root禁止登录,用户权限分配,ssh端口修改,登录时间限制,堡垒机登录. 这里只讲登录时间限制和登录报警通 ...
- VS Code 在线运行:code-server部署(系列一)
偶然间发现VS Code可以在线运行,闲来无事部署了一套试试效果,先上图,是不是很熟悉的感觉,初步体验基本跟本地运行效果一样. 进入正题 首先要准备一套linux环境,环境配置最低是1G内存.2核CP ...
- 操作指南:如何利用Smartbi、Tableau实现地图可视化展示
优秀的地图分析是高信息量与美感兼具的.以往制作地图分析基本都需要依靠编程,制作的门槛比较高,制作也比较复杂.如果有一款只需要套入地理经纬度数据或区域名称,就能自动识别定位出相应位置的地图可视化工具是不 ...
- Shell、命令行界面、控制台什么区别
Shell 是什么?Shell 是一个命令解释器,它为用户提供了一个向 操作系统内核发送请求以便运行程序界面系统级程序,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统,他大意是指对系统的操控 ...
- Hive表数据同步到es
1.首先服务器节点,进入到对应的数据库.2. 然后找到要同步的表,show create table + 表名查看一下或者自己可以新建一个表,用来测试原表,如下 CREATE TABLE `wb_tm ...
- Chrome:开发者模式下js文件中代码显示在一行的解决方法
比如我随便打开一个js文件,可以发现它的代码都挤在一行中,这对我们查找一些变量很不友好 解决方式:点击图中标红的那个按钮就可以了