博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python-互斥锁 进程间通讯
阅读量:7071 次
发布时间:2019-06-28

本文共 2533 字,大约阅读时间需要 8 分钟。

3、守护进程(**)     主进程创建守护进程   其一:守护进程会在主进程代码执行结束后就终止   其二:守护进程内无法再开启子进程,否则抛出异常:         AssertionError: daemonic processes are not allowed to have children     注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止     A进程守护B进程 B进程结束 A也结束     如果父进程将子进程设置为守护进程,那么在主进程代码运行完毕后守护进程就立即被回收     (比如 妃子守护皇帝   皇帝如果死了  妃子也就跟着陪葬了)     用法:         在主进程的对象后加入obj.daemon = True 4、互斥锁(**)(抢票代码)     进程之间数据不共享,但是共享同一套文件系统,         所以访问同一个文件,或同一个打印终端,是没有问题的,         而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理     锁本质上就是一个bool类型的标识符  多个进程在执行任务之前先判断标识符     互斥锁 两个进程相互排斥 (比如  在宿舍大家公用一个厕所 一个使用中 其他人不能用)     锁的原理             就是加上一堆判断 锁相当于一个标记     为什么使用锁,用来解决什么问题?         当多个进程对统一资源进行读写时 引发了数据错乱         解决方案就是变成串行,牺牲了效率而保证了数据安全         只有在多个任务修改共享的数据的时候才会考虑用互斥锁     互斥锁与join的区别:         1.join  把整个进程变成串行  并且顺序是人为指定的         2.锁Lock  可以指定局部哪些代码变成串行 并且对资源的竞争是公平的.一个人拿到锁,其余人都等待         本质上就是一个标识符 True 或 False  多个进程要保证使用同一把锁     如何使用?         from multiprocessing import Lock         mutex=Lock()  进程参数和任务函数的参数中传入lock         在需要加锁的地方 lock.acquire() 表示锁定         在代码执行完后 一定要lock.release() 表示释放锁     强调:         1、一定要在操作完毕后释放锁         2、互斥锁lock.acquire()不能连续执行 (同一线程不能多次acquire   会卡死)     注意 要想锁住资源必须保证 大家拿到锁是同一把     问题?         多个进程同时读写同一份数据时 可能造成数据混乱  (本地IO速度很快 基本不会出现问题)         read读数据么有必要加锁 write写数据必须加 总结:     #加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,         即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。     虽然可以用文件共享数据实现进程间通信,但问题是:         1.效率低(共享数据基于文件,而文件是硬盘上的数据)         2.需要自己加锁处理     #因此我们最好找寻一种解决方案能够兼顾:         1、效率高(多个进程共享一块内存的数据)         2、帮我们处理好锁问题。         这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。             1 队列和管道都是将数据存放于内存中             2 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,         我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,         避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。 5、进程间通讯IPC机制:队列,管道(*)     为什么使用IPC?         由于进程之间内存是物理隔离的 无法直接交互数据     实现方法         1.共享文件   速度慢,没有锁         2.管道PIPE   只能单向传输 必须有父子关系 没有锁 (不推荐使用,了解即可)      !!!3.共享内存   存放共享数据,容量较小  速度快 Manage没有锁 Queue有锁(先进先出)                     (用一块内存区域作为共享的内存区域)             Manager  共享列表或字典  需要自己处理资源竞争             Queue    队列  带有阻塞效果 不用自己处理资源竞争                    先进先出  例如自动扶梯 排队买票 6、进程队列Queue=管道+锁 (***)(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC), multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的     强调:         1、队列Queue用来存成进程之间沟通的消息,数据量不应该过大         2、maxsize的值超过的内存限制就变得毫无意义     from multiprocessing import Queue     q = Queue(3) # Queue里可填数量,3表示存放的数量     q.put("hello")     print(q.get())     q.put("hello",block=False) #阻塞操作,阻塞时会报错     q.put("hello",timeout=3) #如果放满了 愿意等3秒  如果3秒后还存不进去 就报错

转载于:https://www.cnblogs.com/du-jun/p/9947233.html

你可能感兴趣的文章
trie树
查看>>
xshell常用命令大全
查看>>
秒杀?能不能先预估下服务器能不能顶的住再玩啊!!!
查看>>
杀软厂商开源--从此走向平台化?
查看>>
联想笔记本硬件驱动官网下载地址
查看>>
Oracle回顾
查看>>
R中数据结构
查看>>
mysql数据库学习(二)--表操作
查看>>
python装饰器
查看>>
学习Qt的一些心得笔记
查看>>
cookie与session组件
查看>>
Windows Server 2008 R2下将JBoss安装成windows系统服务
查看>>
关于dubbo服务的xml配置文件报错的问题
查看>>
Escape
查看>>
COGS 1299. bplusa【听说比a+b还要水的大水题???】
查看>>
并查集(个人模版)
查看>>
常用OJ名字+地址(自用)
查看>>
STL中的nth_element()方法的使用
查看>>
SVM小白教程(2):拉格朗日对偶
查看>>
在UITableView中动态的插入或删除行(或者节)
查看>>