一、互斥锁

进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。

注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。

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)以及生产者个消费者模型...相关推荐

  1. python由谁设计并领导开发_Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)...

    本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.&quo ...

  2. python全栈开发优势_Python全栈开发多少钱?学Python价格贵吗?

    Python全栈开发培训多少钱?学习Python是大家进入编程世界的理想之选,而且Python也是一门非常受欢迎的编程,可以从事的领域有很多. 从目前市场上的行情来说,一般情况下Python培训的费用 ...

  3. python全栈开发下载_python全栈开发神器 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...

    将安卓手机打造成你的python全栈开发利器 超神利器- 相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Q ...

  4. python全栈测试开发_python全栈的基础知识

    python全栈是什么意思 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念,也分很多种类真正的全栈工程师涵盖了web开发 ...

  5. python全栈开发百度云_Python全栈开发9期视频

    Python全栈开发9期视频 获取教程链接的步骤 2. 用微博或QQ登录编程资源库网站 3.点击兑换按钮,兑换百度云链接 教程要积分! 声明 教程由粉丝投稿,仅供学习和交流,侵删 以下凑字数!请自行忽 ...

  6. python全栈开发实践入门_Python全栈开发实践入门

    Python全栈开发实践入门 编辑 锁定 讨论 上传视频 <Python全栈开发实践入门>是2017年10月电子工业出版社出版的图书,作者是谢瑛俊. 书 名 Python全栈开发实践入门 ...

  7. 开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型...

    开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print(' ...

  8. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  9. Web全栈开发基础(小白入门版本)

    博客传送门 近几个月认真写了写Web全栈代码,有点小收获这里分享一下.我还做了个PPT,资源路径 欢迎拍砖指点! Web全栈开发是一个听起来很虎的名词.本文从技术层面解释全栈开发,能帮助没有全栈概念, ...

最新文章

  1. ubuntu 13.04 mysql_Ubuntu 13.04 MySQL Proxy安装与配置
  2. linux sed面试题,【2021最新版】Linux面试题总结(48道题含答案解析)
  3. 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity
  4. java 文件存在 却找不到文件_当文件确实存在时,ProcessBuilder给出“找不到文件”异常...
  5. VggNet网络结构详解
  6. 问题:为什么我们计算的GDP增长率跟统计局公布的不一样
  7. 小知识 定位测绘领域中全站仪/接收机RTK精度1cm+1ppm的含义
  8. FreeIPA问题记录
  9. ESP8266 开发之旅 网络篇 无线更新 --OTA 固件更新
  10. 亲爱的波特兰——CJ麦科勒姆告别信
  11. 怎么样添加桌面我的计算机,怎么样把我的电脑添加到桌面上
  12. 香橙派 lite 2 使用OV5640
  13. 【STM32】标准库-以太网外设-LAN8720A-LWIP-无操作系统
  14. 几款强大的PPT制作辅助软件
  15. 蓝桥杯 青蛙跳杯子【第八届】【省赛】【C组】 BFS 广搜
  16. 浏览器本地缓存:localStorage与sessionStorage
  17. BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比
  18. Java判断一个序列是否可由给定序列通过栈操作获得(ABCDEF)
  19. 宽带不能上传发文件_为啥4M的宽带为啥下载速度只有300多KB?
  20. 在碟片里奔驰-我的看碟人生

热门文章

  1. @JsonSerialize 与 @JsonDeserialize 使用
  2. IIS服务器SSL证书安装
  3. appium更新到1.8.2,不能打开运行的解决办法
  4. 将以太坊封装为 ERC20
  5. Mssql 跨域查询
  6. CentOS 7 中firewall-cmd命令
  7. Ignite中的机器学习介绍
  8. 极客招募令!兄弟杯区块链极客竞技大赛在上海等您来战!
  9. 网站的SEO以及它和站长工具的之间秘密
  10. hadoop集群的搭建(分布式安装)