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 ...
随机推荐
- 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...
- 加密模块hashlib+日志模块logging
目录 1.hashlib 加密模块 1.hashlib模块基本使用 1.2 详细操作 ①md5加密模式 ②sha256复杂加密模式 ③加盐操作(普通加盐) ④加盐操作(动态加盐) 2.logging ...
- 在win10上安装face_recognition(人脸识别)
github上有个项目face_recognition,是用于人脸识别的 主要是window上安装这个项目会繁琐些,linux上据项目文档上介绍是妥妥的. 项目地址: https://github. ...
- Java如何实现消费数据隔离?
我是3y,一年CRUD经验用十年的markdown程序员常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议 ...
- 疑难杂症:运用 transform 导致文本模糊的现象探究
在我们的页面中,经常会出现这样的问题,一块区域内的文本或者边框,在展示的时候,变得特别的模糊,如下(数据经过脱敏处理): 正常而言,应该是这样的: emmm,可能大图不是很明显,我们取一细节对比,就非 ...
- CesiumJS-01 环境搭建
CesiumJS 环境搭建 操作环境: OS:Windows 10 专业版 19042.685 64 位操作系统 1.安装Node.js (1)打开Node.js官网 https://nodejs. ...
- 为什么我建议在复杂但是性能关键的表上所有查询都加上 force index
最近,又遇到了慢 SQL,简单的看了下,又是因为 MySQL 本身优化器还有查询计划估计不准的问题.SQL 如下: select * from t_pay_record WHERE (( user_i ...
- Excel和BI工具,哪一个数据分析能力更强
随着大数据信息时代的到来,大数据分析已经成为任何企业都无法回避的话题.对于想进入大数据分析行业的朋友来说,这也是必须掌握的基础知识.什么是大数据分析?为什么会对企业产生这么大的影响? 大数据分析是在通 ...
- 【C#基础概念】虚方法virtual
目录: 一.虚方法的概念 二.虚方法的特点 三.虚方法的作用 四.虚方法的声明 五.虚方法的执行 六.虚拟类的规则 一.虚方法的概念 在C#中,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,则 ...
- Qt:QSqlDatabase
0.说明 QSqlDatabase类处理与数据库连接相关的操作.一个QSqlDatabase实例就代表了一个连接,连接时要提供访问数据库的driver,driver继承自QSqlDriver. 通过静 ...