31 锁,信号量,事件,队列


1.同步锁(互斥锁)
from mutilprocessing import Lock
方式一:
lock=Lock()
lock.acquire()
数据操作的代码
lock.release()
方式二:
with lock:
数据操作代码
2.信号量
from mutilprocessing import Semaphore
一把锁,多把钥匙
s=semaphore(n) #同一时间只有n个进程进入锁里的代码
s.acquire()
数据操作代码
s.release()

3.事件
from mutilprocessing import Event
e=Event() #默认
e.set()
e.clear()
e.wait()
e.is_set()
4.
队列 Queue 进程间通信 保证数据安全(同一个数据只有一个进程能拿到)
先进先出
q=Queue()
q.put()
q.get()
q.full()
q.empty()
q.get_nowait()
q.put_nowait()

Jionablequeue 和队列类似 多了两个方法 join() task_done()

守护进程 daemon

随着父进程结束,守护进程跟着结束
p.daemon=True #必须在p.start 前加
如何将一个子进程设置为守护进程,不能在该子进程中再开子进程

生产者和消费者模型:通过一个第三方(类似缓冲区)进行解耦
from multiprocessing import Process,Lock
import timedef show_ticket(i):with open("file","r",encoding="utf-8") as f:num=f.read().strip()print("%s客户查看到了剩余票数:"%i,num)def func1(i,lock):show_ticket(i)print("准备开始抢票了")time.sleep(1)lock.acquire()with open("file","r",encoding="utf-") as f:num=f.read().strip()if num=="0":print("没票了")else:with open("file","w",encoding="utf-8") as f:num=int(num)num-=1f.write(str(num))print("%s客户抢到票了"%i)lock.release()if __name__ == '__main__':lock=Lock()for i in range(10):p=Process(target=func1,args=(i,lock))p.start()
锁LOCK
from multiprocessing import Event,Processe=Event()#两个状态  true false   默认为false
print("开始了")print(e.is_set()) #查看事件当前的状态  #False

e.set() #将当前事件状态改为trueprint(e.is_set())#true

e.clear() #将当前事件改为flase

e.wait()  #事件等待
print(e.is_set())
事件1
from multiprocessing import Process,Event
import time
def func1(e):time.sleep(2)print("子进程一大堆运算")e.set()  #将事件改为trueif __name__ == '__main__':e=Event()p=Process(target=func1,args=(e,))p.start()print("主进程开始程序")time.sleep(1)print("等待子进程通知")e.wait()print("拿到子进程通知,继续执行")
事件2Event
from multiprocessing import Process,Semaphore
import timedef func1(i,s):s.acquire()time.sleep(1)print("%s男嘉宾大保健开始"%i)time.sleep(0.5)print("%s大保健结束"%i)s.release()if __name__ == '__main__':s=Semaphore(3) #信号量和lock类似,多了参数for i in range(10):p=Process(target=func1,args=(i,s))p.start()
信号量semaphore
from multiprocessing import Process,Queuedef func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(5)   #队列是进程安全的q.put("hello gril")p=Process(target=func,args=(q,))p.start()print("主进程结束")def func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(3)q.put("约吗")p=Process(target=func,args=(q,))p.start()print("主进程结束")
基于队列进程通信Queue
from multiprocessing import Process
import os
import time
class Myprocess(Process):def __init__(self,person):super().__init__()self.person=persondef run(self):print(os.getpid(),self.name)print("%s正在和女主播聊天"%self.person)if __name__ == '__main__':p=Myprocess("刘德华")p.daemon=True  #一定要在p.start()之前设置p守护进程,禁止p创建子进程,并且父进程代码执行完毕,p将终止运行
    p.start()time.sleep(1)print("主进程结束")
守护进程daemon
from multiprocessing import Process,Queue
import timedef producer(q):for i in range(10):time.sleep(1)q.put("包子%s号"%i)print("包子%s号生产完毕"%i)q.put(None)def consumer(q):while 1:baozi=q.get()if baozi==None:breaktime.sleep(1.5)print("%s被吃完"%baozi)if __name__ == '__main__':q=Queue(10)p1=Process(target=producer,args=(q,))p2=Process(target=consumer,args=(q,))p1.start()p2.start()
生产者消费者模型
from multiprocessing import Process,JoinableQueueimport time,random,osdef producer(food,q):for i in range(10):time.sleep(random.random())ret="%s%s"%(food,i)q.put(ret)print("%s生产了%s"%(os.getpid(),ret))print("%s生产结束"%food)q.join() #生产完毕,使用此方法进行阻塞 ,直到队列中所有项目均被处理# print("%s生产结束" % food)def consumer(q):while 1:ret=q.get()time.sleep(random.random())print("%s吃了%s"%(os.getpid(),ret))q.task_done()#向q.join()发送一次信号,证明一个数据被取走if __name__ == '__main__':q=JoinableQueue()#生产者们p1=Process(target=producer,args=("包子",q,))p2=Process(target=producer,args=("玉米",q,))p3=Process(target=producer,args=("",q,))#消费者们c1=Process(target=consumer,args=(q,))c2=Process(target=consumer,args=(q,))c1.daemon=Truec2.daemon=True#开始p_1=[p1,p2,p3,c1,c2]for p in p_1:p.start()p1.join()p2.join()p3.join()
JoinableQueue生产者消费者模型

 

转载于:https://www.cnblogs.com/knighterrant/p/10038839.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下文件权限管理

参考:Ubuntu / Linux 下文件权限管理 作者:~莘莘 发布时间: 2021-07-12 17:09:48 网址:https://blog.csdn.net/lcx1837/article/details/118676383?spm1001.2014.3001.5501 目录一、文件权限二、修改文件权限一、文件权限 文件权…

centos上那装qq2012

1、下载qq2012http://115.com/2、把下载的qq2012.tar.gz拷贝到/opt/目录(需要拷贝到/opt/目录)cp qq2012.tar.gz /opt3、解压缩并修改权限tar zxvf qq2012.tar.gzchmod 777 qq20124、安装qq2012cd qq2012/wineapp/qq/./install5、安装依赖包yum install …

linux ndk编译so,有的APP NDK 编译的SO文件 无法调用 PackageManager

反馈BUG之前,先issue里面搜看看有没有别人已经反馈过,重复的不予处理!!问题描述最近下了一个不可描述APP,实机是能运行的,不过在VXP里则报如下错误07-14 15:48:28.672 13477 13477 E test2:fake_dlfcn: /sy…

微信小程序--页面传参

场景&#xff1a; A页面字段---传递到-->B页面 A页面wxml: wx:for----习惯用<block> 设置所点击的值----data-xxx 获取所点击的值---e.currentTarget.dataset.xxx wx:for-index---下标 wx:for-item---对象 <view wx:if"{{open}}"> <block wx:for&…

U-Boot顶层Makefile分析

参考&#xff1a;U-Boot顶层Makefile介绍 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-22 16:22:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109218569 目录0、学习目的1、准备好uboot源码2、分析顶层Makefile2.1、版本号2.2、M…

思科路由器的硬件组成

思科路由器的硬件组成常建议常建议CCNA的学员们&#xff0c;除了能灵活配置与应用思科的路由器和交换机以外&#xff0c;还需要掌握对路由器与交换机的常规维护工作&#xff0c;比如IOS的安装与升级&#xff0c;这个过程好比为一台全新的计算机安装操作系统&#xff0c;在此之前…

linux gone kde 图形程序 兼容,Oracle8i HowTo

现在假设你要在Linux上安装Oracle服务器,请先过以下5关&#xff1a;系统要求规划硬盘创建用户创建目录设置参数1.系统要求前提条件是能够安装运行Linux&#xff0c;然后应满足以下硬件要求&#xff1a;内存 RequirementsMemory  最小要求128 MB RAM.更多(256MB)内存可以提…

U-Boot启动流程详解

参考&#xff1a;U-Boot顶层目录链接脚本文件&#xff08;u-boot.lds&#xff09;介绍 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-23 13:52:23 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109240625 目录链接脚本 u-boot.lds 详解…

CF765F Souvenirs 解题报告

CF765F Souvenirs 题意翻译 给出\(n(2 \le n \le 10^5 )\) &#xff0c;一个长为\(n\)的序列\(a&#xff08;0 \le a_i \le 10^9 )\)。 给出\(m(1\le m \le 2*10^5 )\)&#xff0c;接下来\(m\)组询问。 每组询问给出一个\(l,r(1\le l < r\le n )\)&#xff0c;代表询问最小的…

grunt使用小记之开篇:grunt概述

Grunt是什么&#xff1f; Grunt是一个自动化的项目构建工具。如果你需要重复的执行像压缩&#xff0c;编译&#xff0c;单元测试&#xff0c;代码检查以及打包发布的任务。那么你可以使用Grunt来处理这些任务&#xff0c;你所需要做的只是配置好Grunt&#xff0c;这样能很大程度…

linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)

CentOS(linux) 下Nginx的安装(NginxTomcat集群)CentOS 7.4(腾讯云)pcre库zlib库opensslNginx服务器安装gcc g开发类库yum -y install gcc automake autoconf libtool makeyum install gcc gcc-cwget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz解压pcre库tar -zxvf pcre-8…

Mybatis中 sequence不能自增长

解决方案&#xff1a; 参考&#xff1a; http://leeyee.github.io/blog/2013/08/22/mybatis-auto-increment-primary-key/ <insert id"addSupplier" parameterType"com.pinganfu.GouTong.common.dal.model.SmsSupplierDO" > <selectKey resultT…

在线生成透明ICO图标神器

此神器的链接为&#xff1a;http://ico.duduxuexi.com/ 大家可以将这个网址收藏好&#xff0c;本人亲测十分好用&#xff01;对我们的ios,安卓以及windows开发都有极大的好处。转载于:https://www.cnblogs.com/geeksongs/p/10040935.html

Vim的使用和快捷键介绍

参考&#xff1a;Linux–Vim的使用以及快捷键大全 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-12 12:43:19 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107297756 目录安装vim三种常用的模式三种常用模式的切换vim 快捷键1.一般模…

手机当电脑麦克风 linux,WO Mic让手机成为电脑的无线麦克风

WO Mic 是一款可以让 Android 手机成为电脑无线麦克风的应用&#xff0c;支持 windows 和 Linux&#xff0c;除了 WiFi&#xff0c;还能使用蓝牙以及 USB 数据线(只有安卓支持数据线连接)。官方下载页面如下&#xff1a;一、windows下安装连接windows主机上需要安装客户端和驱动…

如何编写 Cloud9 JavaScript IDE 的功能扩展

上周末我们在JSConf.eu发布了 Cloud9 IDE &#xff0c;同时发布了对应的GitHub项目。在4天时间里该项目得到340个人的关注和将近50个fork。Cloud9的口号是由"由Javascripters 为Javascripters创建的IED"&#xff0c;这口号有点递归&#xff0c;它意味着你可以hack这个…

make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)

目录含有交叉编译、pthread_create()处理初次使用1、编写Makefile文件2、make3、make cleanMakefile基本语法1、Makefile规则格式2、变量3、变量赋值符&#xff08;、:、?、&#xff09;4、模式规则&#xff08;通配符&#xff09;5、自动化变量6、伪目标7、条件判断8、函数使…

Object对象

原文地址&#xff1a;https://wangdoc.com/javascript/ JavaScript原生提供Object对象。JavaScript的所有其他对象都继承自Object对象&#xff0c;即都是Object的实例。Object对象的原生方法分为两类&#xff1a;Object本身的方法与Object的实例方法。Object对象本身的方法 所谓…

树莓派超声波模块测距

参考&#xff1a;树莓派超声波模块测距及C语言demo 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-22 16:54:16 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107516949 前面这篇博文已经讲过了&#xff1a;树莓派外设开发基础&#xf…

spring cloud (一、服务注册demo_eureka)

首先我的博客记理论知识很少&#xff0c;大家对spring boot、spring cloud 、分布式 、微服务什么的一点概念都没有的还请先去百度看看理论&#xff0c;知道了是做什么用的&#xff0c;然后再写下demo ,这样学起来才没有那么迷糊&#xff01; 我一般写下的demo都是我踩了很多坑…