python记录_day31 进程同步和进程通信
一、进程同步
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 进程同步和进程通信的更多相关文章
- python全栈开发day32-进程创建,进程同步,进程间的通信,进程池
一.内容总结 1.进程创建 1) Process:两种创建一个新进程的方法: 1.实例化Process,通过args=(,)元组形式传参,2创建类继承Process,类初始化的时候传参数 2) p.j ...
- python 守护进程、同步锁、信号量、事件、进程通信Queue
一.守护进程 1.主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes ...
- python核心高级学习总结4-------python实现进程通信
Queue的使用 Queue在数据结构中也接触过,在操作系统里面叫消息队列. 使用示例 # coding=utf-8 from multiprocessing import Queue q = Que ...
- python之并发编程(线程\进程\协程)
一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...
- Linux 进程通信之 ——信号和信号量总结
如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存. 所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...
- python 管道、数据共享、进程池
一.管道(Pipe)(了解) (详情参考:https://www.cnblogs.com/clschao/articles/9629392.html) 进程间通信(IPC)方式二:管道(不推荐使用,了 ...
- python并发编程之multiprocessing进程(二)
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...
- Python 基础之 线程与进程
Python 基础之 线程与进程 在前面已经接触过了,socket编程的基础知识,也通过socketserver 模块实现了并发,也就是多个客户端可以给服务器端发送消息,那接下来还有个问题,如何用多线 ...
- 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...
随机推荐
- 密码发生器|2012年蓝桥杯B组题解析第八题-fishers
(10')密码发生器 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现 ...
- P4980 【模板】Polya定理
思路 polya定理的模板题,但是还要加一些优化 题目的答案就是 \[ \frac{\sum_{i=1}^n n^{gcd(i,n)}}{n} \] 考虑上方的式子怎么求 因为\(gcd(i,n)\) ...
- Graph Convolutional Networks (GCNs) 简介
Graph Convolutional Networks 2018-01-16 19:35:17 this Tutorial comes from YouTube Video:https://www ...
- [CodeForce 801A] Vicious Keyboard
题目链接:http://codeforces.com/problemset/problem/801/A 思路:题目中字符串的长度最长100个字符,所以,可以考虑用暴力,先遍历一遍匹配"VK& ...
- Java基础【基本数据类型包装类、int与String 之间的相互转换】
为什么会有基本类型包装类? 将基本类型数据类型封装成对象,这样的好处可以在对象中定义更多方法操作该数据. 包装类常用的操作就是用于基本数据类型与字符串之间的转换 问题:int a=100; 为什么不能 ...
- Bytom设计结构解读
一.引文 设计Bytom 数据结构,组合了许多技术点,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等.本文会对一些技术 ...
- 【C#】非常重要的泛型
泛型 为什么要有泛型, 在没有泛型之前, 什么东西充当了泛型的作用? 在泛型出现之前, 代码中会有很多需要强制转换的地方. 比如 int a = (int) object, 对于这样类似的代码, 编译 ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
本文为博主原创: 以下为在程序运行过程中报的错误, org.springframework.dao.CannotAcquireLockException: ### Error updating dat ...
- Jquery 点击事件重复获取叠加 (一)
用jquery添加绑定事件 添加多少次 点击的时候就触发多少次 如果想解决这个问题 就在点击函数里先用 $(对象).off("click") 取消上一次的点击事件 上码: $(&q ...
- linux_nmon监控方法
一.介绍 Nmon 工具是 IBM 提供的免费的在AIX与各种Linux操作系统上广泛使用的监控与分析工具.该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工 ...