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秒后还存不进去 就报错

Python-互斥锁 进程间通讯的更多相关文章

  1. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯

    本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...

  2. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  3. 守护进程,进程安全,IPC进程间通讯,生产者消费者模型

    1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...

  4. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  5. C#进程间通讯或同步的框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下  0.背景简介 微软在 .NET 框架中提供了多种实用 ...

  6. 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 百篇博客分析OpenHarmony源码 | v28.03

    百篇博客系列篇.本篇为: v28.xx 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...

  7. C#进程间通讯技术-整理。

    原文:C#进程间通讯技术-整理. 扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1) ...

  8. C# 进程间通讯

    扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1)共享内存 包括:内存映射文件,共享 ...

  9. Linux 进程间通讯

    一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

随机推荐

  1. select和select的数据渲染,你知道多少呢?

    select和option是一对好兄弟,他们是一个很强大的组合.多个元素组合在一起才有的属性,他们两个加起来一切都有了. 所谓的面包也要,鲜花也要,就是这么的任性. 首先看看他们的基本html结构 当 ...

  2. Code-force 1003 E Tree Constructing

                                                                                                    E. T ...

  3. KindEditor 4.1.2版本,在上传图片的时候 设置为绝对路径

    被这个问题困扰了很久,最终搞定,竟然是如此之简单.   方法如下: 1.打开编辑器目录下的:kindeditor.js 2.修改:urlType : ”, 为:urlType : ‘domain’, ...

  4. C#网络编程之进程管理

    这里是视频讲解地址: 这里是代码: using System; using System.Collections.Generic; using System.Linq; using System.Ne ...

  5. TCP粘包,拆包及解决方法

    在进行Java NIO学习时,发现,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题.我们都知道TCP属于传输 ...

  6. Python入门系列教程(一)基础

    基础知识 1.变量及类型 2.换行\n 3.输入 password = raw_input("请输入密码:") print '您刚刚输入的密码是:', password 4.格式化 ...

  7. 5. SprigBoot自动配置原理

      配置文件到底能写什么?怎么写? 都可以在SpringBoot的官方文档中找到: 配置文件能配置的属性参照   1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功 ...

  8. Hadoop mapreduce执行过程涉及api

    资源的申请,分配过程略过,从开始执行开始. mapper阶段: 首先调用默认的PathFilter进行文件过滤,确定哪些输入文件是需要的哪些是不需要的,然后调用inputFormat的getSplit ...

  9. luogu P2680 运输计划

    传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...

  10. R 的农场 chebnear (二分答案+最近平面点对)

    题面 \(solution:\) 这道题想到二分答案应该是不难的,因为题目是求平均工资的最小值,这个显然具备单调性: 我们设平均工资的最小值为ans,如果我们现在的平均工资x小于ans那么将x带入题目 ...