锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)
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)的更多相关文章
- 进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38
进程同步(multiprocess.Lock.multiprocess.Semaphore.multiprocess.Event) 锁 —— multiprocess.Lock 通过刚刚的学习,我们千 ...
- Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))
五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...
- 【python】-- 信号量(Semaphore)、event(红绿灯例子)
信号量(Semaphore) 之前讲的线程锁(互斥锁) 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里 ...
- Javascript事件机制兼容性解决方案
本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...
- 【iScroll源码学习03】iScroll事件机制与滚动条的实现
前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...
- jQuery中的事件机制深入浅出
昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...
- gtest 三种事件机制
前言: 1.首先说明gtest中事件的结构层次: 测试程序:一个测试程序只有一个main函数,也可以说是一个可执行程序是一个测试程序.该级别的事件机制会在程序的开始和结束执行. 测试套件:代表一个测试 ...
- ApplicationEvent事件机制源码分析
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- 深入理解React:事件机制原理
目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...
随机推荐
- java ssl https 连接详解 生成证书 tomcat keystone
java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...
- ros建立ospf邻居的条件
Two routers do not become neighbors unless the following conditions are met. Two way communication b ...
- Java 迭代器 工具类
迭代器:Iterator接口 //获取集合中的对象Iterator<E> iterator() interface Iterator { boolean hasNext(); Object ...
- 在配置静态IP的时候遇到 :bringing up interface eth0 : error unknown connection
首先这是动态ip配置成功的结果 接下来切换到root用户来配置静态的 按照静态ip的配置方法配置好文件后(具体过程这里就不多加说明) 然后保存退出 当我们重启网卡的时候问题来了(因为本人有点强迫症,多 ...
- Linux下Nagios的安装与配置 及遇到的坑
原文http://www.jianshu.com/p/7bc822fa8278 不愿意看前5.6c部分可以直接跳到最后看命令. 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能 ...
- Swift里的CAP理论和NWR策略应用
http://blog.sina.com.cn/s/blog_57f61b490101a8ca.html 最近有人讨论到swift副本数是否能够调整,3副本成本过高,如果改成2副本怎么样?多聊了几句以 ...
- LinkedHashMap唯一,存储取出有序
package cn.itcast_03; import java.util.LinkedHashMap; import java.util.Set; /* * LinkedHashMap:是Map接 ...
- sweetalert插件使用
内容: 1.插件介绍 2.插件使用 1.插件介绍 SweetAlert是一个JS插件,能够完美替代JS自带的alert弹出框,并且功能强大,设计优美 使用这个很方便,推荐使用这个插件来写alert s ...
- spring中 的MD5 加密
//对密码进行加密(不需要使用其他Md5工具 .spring中有 在digestUtils) String password = DigestUtils.md5DigestAsHex( ...
- leetcode66
public class Solution { public int[] PlusOne(int[] digits) { ]; < ) { digits[digits.Length - ]++; ...