锁机制(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 上注册 回调函数存储 事件分发 小结 参考 ...
随机推荐
- COMMON INTERVIEW QUESTIONS
1. What do you see yourself doing five years from now? 2. What motivates you to put forth your great ...
- PHP下载文件的几种方案
PHP下载远程文件的3种方法以及性能考虑 2014-02-21 0个评论 收藏 我要投稿 今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很 ...
- vlc 网页插件的 使用与控制 API http://www.xuebuyuan.com/2224602.html
不知道vlc 是什么的请百度一下.. vlc 提供了ie浏览器的activeX插件和火狐或者chrome的插件,基本上覆盖了所有浏览器,所以有复杂解码需求的情况下用vlc来解决网页播放视频,也是一种没 ...
- SQL语句嵌套if
在存储过程中我要实现一个IF的嵌套语句查询,类似与 if() { if() { ...... } else { .... ...
- 统计numpy数组中每个值的个数
import numpy as np from collections import Counter data = np.array([1.1,2,3,4,4,5]) Counter(data) #简 ...
- ubuntu 16.04 LTS 安装 teamviewer 13
背景介绍 由于需要做现场的远程支持,经协商后在现场的服务器上安装TeamViewer 以便后续操作. 本来以为很简单的一件事,谁知却稍微费了一番周折 :( 记录下来,希望提醒自己的同时也希望能够帮到 ...
- js判断各种浏览器
<script type="text/javascript"> if (navigator.appName.indexOf("Microsoft Intern ...
- JVM内部细节之二:偏向锁(Biased Locking)
在前面一片文章<JVM内部细节之一:synchronized关键字及实现细节>中已经提到过偏向锁的概念,在理解什么是偏向锁前必须先理解什么是轻量级锁(Lightweight Locking ...
- HTML5须知的特征和技术
1.新的Doctype XHTML文档类型 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- ATM+购物商城
知识内容: 1.luffy买tesla 2.ATM+购物商城 一.luffy买tesla 需求: 1.目录结构说明 account luffy.json --> 存储用户账户信息 {" ...