IPC  进程间通信(inter-Process Communicate)

锁机制(Lock)

  l = Lock() 开启一个锁机制(实例化)   一把锁配一个钥匙

  l.acquire()  获得钥匙,锁门

  l.release()  还钥匙,开门

# 模拟银行取钱机制
from multiprocessing import Lock,Process
import time def save_money(l,num):
l.acquire() # 获得钥匙,锁门
for i in range(,):
num +=
print(num)
l.release() # 还钥匙,开门 def draw_money(l,num):
l.acquire()
for i in range(,):
num -=
print(num)
l.release() if __name__ == '__main__':
l = Lock() # 实例化一个锁
num =
p = Process(target=save_money,args=(l,)) # 实例化一个子进程
p.start() # 开启子进程
p1 = Process(target=draw_money,args=(l,)) # 实例化一个子进程
p1.start() # 开启p1这个子进程
time.sleep()
print(num)
# 模拟抢票机制
from multiprocessing import Process,Lock def check_ticket(i): # 不受限制所有人都可以查询
with open('ticket') as f:
num = f.read()
print('第%s个人查到还有%s张票。' % (i,num)) def buy_ticket(i,l): # 受限制的,有一个人在买票的时候其他人不能进行买票操作需要等待上一个人操作完。
l.acquire()
with open('ticket') as f:
num = int(f.read())
if num > 0: # 判断票数是否大于零,否的话则不能进行买不到票。
print('\033[32m 第%s个人买到票了。\033[0m' % i)
num -= 1
else:
print('\033[31m 第%s个人没有买到票。\033[0m' % i)
with open('ticket','w') as f: # 把修改后的票数更新到数据库中(此处为文件中)
f.write(str(num))
l.release() if __name__ == '__main__':
l = Lock()
for i in range(1,11):
p = Process(target=check_ticket,args=(i,))
p.start()
for i in range(1,11):
p1 = Process(target=buy_ticket,args=(i,l))
p1.start()

信号量机制(Semaphore)

  sem = Semaphore(5) 实例化一个把锁但是这把锁可以有多把钥匙(此处为5把)

  sem.acquire()  获得钥匙,锁门

  sem.release()  还钥匙,开门

  它比Lock多了一个计数器的功能,程序进行一次acquire钥匙个数就减一,进行release一次钥匙个数就加一,当钥匙数为0时,acquire是处于阻塞状态

  

# 信号量机制的例子
from multiprocessing import Process,Semaphore
import time
import random def func(i,sem):
sem.acquire() # 获得钥匙,锁门
print('\033[32m 第%s个人进了小黑屋,锁门。\033[0m' % i)
num = random.randint(1, 3)
time.sleep(num)
print(num)
print('\033[31m 第%s个人出了小黑屋,开门。\033[0m' % i)
sem.release() # 还钥匙,开门 if __name__ == '__main__':
sem = Semaphore(3) # 实例化一个信号量机制
for i in range(1,21):
p = Process(target=func,args=(i,sem)) # 实例化子进程
p.start()

事件机制(Event)

  e = Event()  实例化一个事件机制

  e.set()    将事件机制的is_set()设置为True

  e.clear()  将事件机制的is_set()设置为False

  e.wait()    事件通过is_set()的bool值来判断它是否阻塞,当bool值为True时,wait() 为非阻塞状态,bool值为False时,wait() 为阻塞状态。

  e.is_set()  标识,值是bool类型。

  

# 事件机制的例子
from multiprocessing import Process,Event
import time def Tra(e):
e.set() # 把is_set()的bool值,设置为True
print('\033[32m 绿灯亮了 \033[0m')
while 1:
if e.is_set(): # 判断is_set()的bool值为True,则wait()非阻塞
time.sleep(5)
print('\033[31m 红灯亮了 \033[0m')
e.clear() # 绿灯时间完,把is_set()的bool值设置成False
else:
time.sleep(5)
print('\033[32m 绿灯亮了 \033[0m')
e.set() # 红灯时间完,需要变成绿灯,所以需要通过set()来把is_set()的bool值设为True def Car(e,i):
e.wait() # 如果is_set()的bool值为True,wait()为非阻塞,可以通车,否则就为阻塞不可以通车
print('第%s辆车通过' % i) if __name__ == '__main__':
e = Event() # 实例化一个事件机制
traffic_light = Process(target=Tra,args=(e,))
traffic_light.start()
for i in range(1,51):
time.sleep(1)
car = Process(target=Car,args=(e,i))
car.start()

锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)的更多相关文章

  1. 进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38

    进程同步(multiprocess.Lock.multiprocess.Semaphore.multiprocess.Event) 锁 —— multiprocess.Lock 通过刚刚的学习,我们千 ...

  2. Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))

    五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...

  3. 【python】-- 信号量(Semaphore)、event(红绿灯例子)

    信号量(Semaphore) 之前讲的线程锁(互斥锁) 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里 ...

  4. Javascript事件机制兼容性解决方案

    本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...

  5. 【iScroll源码学习03】iScroll事件机制与滚动条的实现

    前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...

  6. jQuery中的事件机制深入浅出

    昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...

  7. gtest 三种事件机制

    前言: 1.首先说明gtest中事件的结构层次: 测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序.该级别的事件机制会在程序的开始和结束执行. 测试套件:代表一个测试 ...

  8. ApplicationEvent事件机制源码分析

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  9. 深入理解React:事件机制原理

    目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...

随机推荐

  1. spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  2. (转!)大话websocket

    邪正看眼鼻,真假看嘴唇,功名看气概,富贵看精神. ---曾国藩<冰鉴> 转自https://www.cnblogs.com/fuqiang88/p/5956363.html 原文http: ...

  3. js之ActiveX控件使用说明 new ActiveXObject()

    什么是 ActiveX 控件? ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容.在某些情况下,这些程 ...

  4. js如何判断小数点后有几位

    <script> var n=3.143423423;alert(n.toString().split(".")[1].length); </script> ...

  5. OpenGL 画出雷达动态扫描效果(一)

    最终效果如下所示 Demo下载  http://files.cnblogs.com/xd-jinjian/Debug.zip 源代码下载 http://download.csdn.net/detail ...

  6. CCKS 2018 | 最佳论文:南京大学提出DSKG,将多层RNN用于知识图谱补全

    作者:Lingbing Guo.Qingheng Zhang.Weiyi Ge.Wei Hu.Yuzhong Qu 2018 年 8 月 14-17 日,主题为「知识计算与语言理解」的 2018 全国 ...

  7. solr之模糊搜索(Fuzzy matching)

    solr的模糊搜索主要有通配符,范围查询,近距离搜索等几类.下面分别探讨一下用法. 1. 通配符查询 通配符只是对单个term有效,对短语不起作用,ps:短语就是在查询条件上加双引号,比如 title ...

  8. 利用Win10计划任务 + 弹窗,提醒你自己

    博主公司周报漏交一次要缴纳50RMB部门经费,另外博主每天上午下午都需要活动10分钟(好像放风..),防止职业病 + 让自己的工作状态更好. 步骤: 1.打开Win10控制面板 —> 点选管理工 ...

  9. 搭建Hive 2.1.1 基于Hadoop 2.6.1 和 Ubuntu 16.0.4 记录

        Hadoop Hive Hbase 对应版本 Hive官网下载 我们以Hadoop版本作为参考适配Hive Hbase即可, Hadoop版本是2.6.1 所以可以选择Hive1.2.1以上版 ...

  10. 显示锁(一)Lock显示锁的优点

    转载自 Java 并发:Lock 框架详解 摘要: 我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchroni ...