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 ...
随机推荐
- python篇第10天【While 循环语句】
while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环,此外"判断条件"还可以是个常值 ...
- Solution -「CF 575G」Run for beer
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\), ...
- Java并发基础之Compare And Swap/Set(CAS)
什么是 CAS?CAS(Compare And Swap/Set)比较并交换, CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N). V 表示待更新的变量(内存值), E 表示预期值(旧 ...
- 使用stream流按时间段进行分组
public Map<String, Object> blogClassify(Integer pageNo, Integer pageSize) { // 1.创建分页page对象 Pa ...
- 不用rustup,Windows下gnu版Rust安装与开发环境配置
写在前面 本文介绍了在不使用rustup的情况下,在Windows上安装gnu版的Rust,并配置开发环境(VSCode + rust-analyzer,CLion + IntelliJ Rust)的 ...
- tomcat编码错乱问题
问题场景:相同的代码,在同事电脑上可以正常运行,在我电脑上用项目跑代码的时候,密文没法解密,用main方法就可以,而且用同事代码打的war包在我本地也不行,初步排查,应该是本地环境的问题. 场景1:本 ...
- 医疗BI系统的数据分析是怎样的?
在社会日益发展和信息化的过程中,已经发展处行业化.智能化的各类IT系统及子系统,如ERP.CRM.财务等等.实现经营流程数字化的同时,各行业企业的数据库日益庞大,医疗行业也不例外.我国医疗行业经过多年 ...
- Python第一讲以及计算机基础
本周课程安排 python基础(五天) 下周课程安排 tableau图形化表制作 下下周课程安排 spss 今日内容概要 计算机发展史 计算机主要硬件 编程与编程语言 python解释器及IDE编辑器 ...
- glibc2.29以上 IO_FILE 及 house of pig
摆烂很长时间之后,终于下定决心来看点新的东西.正好 winmt 师傅前不久把他 pig 修好的附件发给我了,我就借此来学习一下新版本的 IO_FILE 及 house of pig. 新版本的 IO_ ...
- (数据科学学习手札134)pyjanitor:为pandas补充更多功能
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 pandas发展了如此多年,所包含的功能已 ...