python进程通信方式有几种_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型...
一、互斥锁
进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。
注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。
1.上厕所的小例子:你上厕所的时候肯定得锁门吧,有人来了看见门锁着,就会在外面等着,等你吧门开开出来的时候,下一个人才去上厕所。
from multiprocessing import Process,Lock
import os
import time
def work(mutex):
mutex.acquire()
print(‘task[%s] 上厕所‘%os.getpid())
time.sleep(3)
print(‘task[%s] 上完厕所‘%os.getpid())
mutex.release()
if __name__ == ‘__main__‘:
mutex = Lock()
p1 = Process(target=work,args=(mutex,))
p2 = Process(target=work,args=(mutex,))
p3 = Process(target=work,args=(mutex,))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print(‘主‘)
2.模拟抢票(也是利用了互斥锁的原理 :LOCK互斥锁)
import json
import time
import random
import os
from multiprocessing import Process,Lock
def chakan():
dic = json.load(open(‘piao‘,)) # 先查看票数,也就是打开那个文件
print(‘剩余票数:%s‘ % dic[‘count‘]) # 查看剩余的票数
def buy():
dic = json.load(open(‘piao‘,))
if dic[‘count‘]>0: #如果还有票
dic[‘count‘]-=1 #就修改里面的值-1
time.sleep(random.randint(1,3)) #执行里面买票的一系列操作就先不执行了,让睡一会代替(并且随机的睡)
json.dump(dic,open(‘piao‘,‘w‘))
print(‘%s 购票成功‘ % os.getpid()) # 当前的那个id购票成功
def task(mutex): #抢票
chakan() #因为查看的时候大家都可以看到,不需要加锁
mutex.acquire() #加锁
buy() #买的时候必须一个一个的买,先等一个人买完了,后面的人在买
mutex.release() #取消锁
if __name__ == ‘__main__‘:
mutex = Lock()
for i in range(50):#让50个人去访问那个票数
p = Process(target=task,args=(mutex,))
p.start()
二、Process对象的其他属性
p.daemon :守护进程(必须在开启之前设置守护进程):如果父进程死,子进程p也死了
p.join:父进程等p执行完了才运行主进程,是父进程阻塞在原地,而p仍然在后台运行。
terminate:强制关闭。(确保p里面没有其他子进程的时候关闭,如果里面有子进程,你去用这个方法强制关闭了就会产生僵尸进程(打个比方:如果你老子挂了,你还没挂,那么就没人给你收尸了,啊哈哈))
is_alive:关闭进程的时候,不会立即关闭,所以is_alive立刻查看的结果可能还是存活
p.join():父进程在等p的结束,是父进程阻塞在原地,而p仍然在后台运行
p.name:查看名字
p.pid :查看id
我们可以简单介绍一下僵尸进程:
子进程运行完成,但是父进程迟迟没有进行回收,此时子进程实际上并没有退出,其仍然占用着系统资源,这样的?进程称为僵尸进程。
因为僵尸进程的资源一直未被回收,造成了系统资源的浪费,过多的僵尸进程将造成系统性能下降,所以应避免出现僵尸进程。
from multiprocessing import Process
import os
import time
def work():
print(‘%s is working‘%os.getpid())
time.sleep(3)
if __name__ == ‘__main__‘:
p1 =Process(target=work)
p2 =Process(target=work)
p3 =Process(target=work)
# p1.daemon = True
# p2.daemon = True #守护进程(守护他爹)
# p3.daemon = True #主进程死了子进程也死了(就不会执行子进程了)
p1.start()
p2.start()
p3.start()
p3.join()
p2.join()
p1.join() #多个join就是在等花费时间最长的那个运行完就执行主程序了
print(‘主程序‘)
# -了解方法---------------
# p1.terminate() #强制关闭进程
# time.sleep(3)
# print(p1.is_alive()) #看是不是还活着
# print(p1.name) #查看进程名字
# print(p1.pid) #查看id号
# print(‘主程序‘)
三、进程间的三种通信(IPC)方式:
方式一:队列(推荐使用)
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的
1.队列:队列类似于一条管道,元素先进先出
需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态
2.队列分类
队列有很多种,但都依赖与模块queue
queue.Queue() #先进先出
queue.LifoQueue() #后进先出
queue.PriorityQueue() #优先级队列
queue.deque() #双线队列
创建队列的类(底层就是以管道和锁定的方式实现):
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,
可以使用Queue实现多进程之间的数据传递。
参数介绍:
maxsize是队列中允许最大项数,省略则无大小限制。
方法介绍:
q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.get_nowait():同q.get(False)
q.put_nowait():同q.put(False)
q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样
应用:
#队列
# 1.可以往队列里放任意类型的
# 2.先进先出
from multiprocessing import Process,Queue
q= Queue(3)
q.put(‘first‘) #默认block=True
q.put(‘second‘)
q.put(‘third‘)
print(q.get())
print(q.get())
print(q.get())
python进程通信方式有几种_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型...相关推荐
- python由谁设计并领导开发_Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)...
本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.&quo ...
- python全栈开发优势_Python全栈开发多少钱?学Python价格贵吗?
Python全栈开发培训多少钱?学习Python是大家进入编程世界的理想之选,而且Python也是一门非常受欢迎的编程,可以从事的领域有很多. 从目前市场上的行情来说,一般情况下Python培训的费用 ...
- python全栈开发下载_python全栈开发神器 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
将安卓手机打造成你的python全栈开发利器 超神利器- 相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Q ...
- python全栈测试开发_python全栈的基础知识
python全栈是什么意思 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念,也分很多种类真正的全栈工程师涵盖了web开发 ...
- python全栈开发百度云_Python全栈开发9期视频
Python全栈开发9期视频 获取教程链接的步骤 2. 用微博或QQ登录编程资源库网站 3.点击兑换按钮,兑换百度云链接 教程要积分! 声明 教程由粉丝投稿,仅供学习和交流,侵删 以下凑字数!请自行忽 ...
- python全栈开发实践入门_Python全栈开发实践入门
Python全栈开发实践入门 编辑 锁定 讨论 上传视频 <Python全栈开发实践入门>是2017年10月电子工业出版社出版的图书,作者是谢瑛俊. 书 名 Python全栈开发实践入门 ...
- 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...
开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...
- Python全栈开发记录_第一篇(循环练习及杂碎的知识点)
Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...
- Web全栈开发基础(小白入门版本)
博客传送门 近几个月认真写了写Web全栈代码,有点小收获这里分享一下.我还做了个PPT,资源路径 欢迎拍砖指点! Web全栈开发是一个听起来很虎的名词.本文从技术层面解释全栈开发,能帮助没有全栈概念, ...
最新文章
- ubuntu 13.04 mysql_Ubuntu 13.04 MySQL Proxy安装与配置
- linux sed面试题,【2021最新版】Linux面试题总结(48道题含答案解析)
- 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity
- java 文件存在 却找不到文件_当文件确实存在时,ProcessBuilder给出“找不到文件”异常...
- VggNet网络结构详解
- 问题:为什么我们计算的GDP增长率跟统计局公布的不一样
- 小知识 定位测绘领域中全站仪/接收机RTK精度1cm+1ppm的含义
- FreeIPA问题记录
- ESP8266 开发之旅 网络篇 无线更新 --OTA 固件更新
- 亲爱的波特兰——CJ麦科勒姆告别信
- 怎么样添加桌面我的计算机,怎么样把我的电脑添加到桌面上
- 香橙派 lite 2 使用OV5640
- 【STM32】标准库-以太网外设-LAN8720A-LWIP-无操作系统
- 几款强大的PPT制作辅助软件
- 蓝桥杯 青蛙跳杯子【第八届】【省赛】【C组】 BFS 广搜
- 浏览器本地缓存:localStorage与sessionStorage
- BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比
- Java判断一个序列是否可由给定序列通过栈操作获得(ABCDEF)
- 宽带不能上传发文件_为啥4M的宽带为啥下载速度只有300多KB?
- 在碟片里奔驰-我的看碟人生