一、进程同步

1、同步锁(又叫互斥锁)

加锁的代码以后,同一时间内只能被一个进程执行

 from multiprocessing import Process, Lock

 def fun(loc):

       loc.acquire()    #加锁
pass #这里的代码只能被一个进程执行
loc.release() #释放锁 if __name__ =="__mian__": loc = Locke() #创建锁对象
p = Process(target=fun,args=(loc,))
p.start()

加锁语法

2、信号量

信号量相当于有多把钥匙的锁。同一时间允许多个进程执行加锁的代码

信号量中有一个计数器,进来一个进程计数器+1,出去一个进程计数器-1

 from multiprocessing import Process, Semaphore

 def fun():

     s.acquire()   #信号量中计数器+1
pass #这里的代码最多能被4个进程同时执行
s.release() #信号量中计数器-1 if __name__ =="__main__":
s = Semaphore(4)
p = Process(target=fun,args=(m,))
p.start()

信号量语法

3、事件

e = Event()   创建一个事件对象,有两个状态,True和False,默认是False

e.wait()   事件状态为false时等待

e.set()   将事件状态设置为True

e.clear()   将事件状态改为False

二、进程通信

1、守护进程

将一个进程设置为守护进程:   p.daemon = True

# 正常情况下,子进程和主进程异步执行,所以子进程的执行不会受主进程状态的影响,但设为守护进程后,守护进程会随着主进程代码的结束而结束。

# 主进程代码结束不意味着主进程结束,主进程是要等子进程都结束才结束的,给子进程收尸。

# 如果一个子进程设置为了守护进程,它里面就不能再开子进程了。

2、队列

队列是进程安全的。因为它里边的数据取一次就没了,在进程通信时推荐使用。

q = Queue(n)    创建队列对象,能容纳 n 个元素

q.put()    往队列中添加数据,队列满时会等待

q.get()     从队列中取数据,队列空时会等待

q.full()    判断队列是否满了

q.empty()   判断队列是否为空

q.get_nowait()   或  q.get(False)   取数据时不等待

q.put_nowait()    或  q.put(False)   添加数据时不等待

3、生产者消费者模型

就是使用缓冲区将多个进程解耦

一般使用队列,一个进程往里放数据,一个进程取数据,也就是一个生产,一个消费

4、joinablequeue

升级版队列,比队列多了两个方法task_done和join,其他用法一样

q.task_done()   给队列发送一个信号

q.join()   队列接收一个信号

joinablequele相当于内部有一个计数器,put一个数据,计数器+1,然后取一个数据后用task_done()发一个信号,join接收信号,程序阻塞,当jion接收到和计数器相同的信号数量时结束阻塞。

python记录_day31 进程同步和进程通信的更多相关文章

  1. python全栈开发day32-进程创建,进程同步,进程间的通信,进程池

    一.内容总结 1.进程创建 1) Process:两种创建一个新进程的方法: 1.实例化Process,通过args=(,)元组形式传参,2创建类继承Process,类初始化的时候传参数 2) p.j ...

  2. python 守护进程、同步锁、信号量、事件、进程通信Queue

    一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...

  3. python核心高级学习总结4-------python实现进程通信

    Queue的使用 Queue在数据结构中也接触过,在操作系统里面叫消息队列. 使用示例 # coding=utf-8 from multiprocessing import Queue q = Que ...

  4. python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  5. Linux 进程通信之 ——信号和信号量总结

    如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...

  6. python 管道、数据共享、进程池

    一.管道(Pipe)(了解) (详情参考:https://www.cnblogs.com/clschao/articles/9629392.html) 进程间通信(IPC)方式二:管道(不推荐使用,了 ...

  7. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  8. Python 基础之 线程与进程

    Python 基础之 线程与进程 在前面已经接触过了,socket编程的基础知识,也通过socketserver 模块实现了并发,也就是多个客户端可以给服务器端发送消息,那接下来还有个问题,如何用多线 ...

  9. 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...

随机推荐

  1. SpringBoot 使用jwt进行身份验证

    这里只供参考,比较使用jwt方式进行身份验证感觉不好,最不行的就是不能退出 登陆时设定多长过期时间,只能等这个时间过了以后才算退出,服务端只能验证请求过来的token是否通过验证 Code: /** ...

  2. POJ 3903 Stock Exchange(LIS || 线段树)题解

    题意:求最大上升子序列 思路:才发现自己不会LIS,用线段树写的,也没说数据范围就写了个离散化,每次查找以1~a[i]-1结尾的最大序列答案,然后更新,这样遍历一遍就行了.最近代码总是写残啊... 刚 ...

  3. Android中EditText焦点问题

    https://www.jianshu.com/p/3d31d681f4bc 问题:当EditText失去焦点时做内容校验 场景:用户编辑EditText将内容清空,当点击空白地方时关闭软键盘,同时校 ...

  4. 论文笔记:Capsules for Object Segmentation

    Capsules for Object Segmentation 2018-04-16  21:49:14 Introduction: ----

  5. (转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)

    本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA 专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 201 ...

  6. SpringBatch是什么?

    https://segmentfault.com/a/1190000016278038 <dependency> <groupId>org.springframework.bo ...

  7. (转载)http和socket之长连接和短连接区别

    TCP/IPTCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.在传输层中有TCP协议与UDP协议.在应用层有: ...

  8. 【Hadoop 分布式部署 八:分布式协作框架Zookeeper架构功能讲解 及本地模式安装部署和命令使用 】

    What  is  Zookeeper 是一个开源的分布式的,为分布式应用提供协作服务的Apache项目 提供一个简单的原语集合,以便与分布式应用可以在他之上构建更高层次的同步服务 设计非常简单易于编 ...

  9. Kubernetes体系结构

      Nodes Node Status Addresses Phase Condition Capacity Info Management Node Controller Self-Registra ...

  10. appium长按按钮

    public static AndroidDriver driver; /长按操作:waitAction的参数单位是ms/ public static void longClick(String id ...