Python中的PV操作
原文链接:https://blog.csdn.net/qq_40760732/article/details/89513663
仅为学习记录
PV操作的特点:
原子性,P和V操作不可分!
连续性,P和V操作是不间断的。
P自己,V对方:P的是自己的信号量减1,V的是对方的信号量加1.
文章开头,先来一段要背的内容
接下来,先给两个网上的案例热热身
案例一:
import threading,time
lock_1 = threading.Semaphore(1) #检查售票员是否关门
lock_2 = threading.Semaphore(0) #检查司机是否停车
def 司机():for i in range(3):lock_1.acquire()print('司机开车')time.sleep(1)print('驾驶')print('到站停车')lock_2.release()
def 售票员():for i in range(3):lock_2.acquire()time.sleep(1)print('打开车门')print('乘客上下车')time.sleep(1)print('关上车门')lock_1.release()
if __name__=='__main__':p1 = threading.Thread(target=司机)p2 = threading.Thread(target=售票员)p1.start()p2.start()p1.join()p2.join()
解释:
1.里面的lock_1,lock_2为两个信号量;
2.lock_1.acquire()为P操作,lock_1.release()为V操作;
3.lock_1 = threading.Semaphore(1)的意思是将信号量lock_1的初值赋为1。
注意:
Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
我们将lock_1的初值赋为1,lock_2的初值赋为0,则先执行司机这一线程。
案例二:
import queue,random,threading
from time import sleeps_1 = threading.Semaphore(1) # 临界区互斥信号量
s_2 = threading.Semaphore(5) # 判断是否有空闲缓冲区的信号量
s_3 = threading.Semaphore(0) # 判断缓冲区里是否有产品的信号量def productor(i, q):while True:num = random.choice(['华为P30', '小米9', 'ViVo x27', 'iphone XR'])print('生产者%d生产了产品%s' % (i, num))s_2.acquire() # 是否有空缓冲区s_1.acquire() # 缓冲区是否被占用q.put(num)sleep(1)print('生产者%d把产品%s放入了仓库中' % (i, num))s_1.release()s_3.release()def consumer(i, q):while True:s_3.acquire()s_1.acquire()num = q.get()sleep(1)print('消费者%d购买了产品%s' % (i, num))s_1.release()s_2.release()if __name__ == '__main__':q = queue.Queue(5) # 创建上限为5的缓冲区# 创建4个生产者for i in range(4):threading.Thread(target=productor, args=(i, q)).start()# 创建6个消费者for i in range(6):threading.Thread(target=consumer, args=(i, q)).start()
信号量:
设置三个信号量,一个信号量判断缓冲区是否被占用,一个信号量判断缓冲区是否有空,最后一个信号量判断缓冲区里是否有东西。
生产者:四个
消费者:六个
缓冲区:五个
某一时刻只能有一个线程或进程访问缓冲区,缓冲区没满时生产者可以往里面放东西,缓冲区没空时消费者可以从里面取东西。
PV操作的简单了解:
进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:
进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。
信号量
信号量是最早出现的用来解决进程同步与互斥问题的机制。
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
注意,信号量的值只能由PV操作来改变。
最后来一句顺口溜笔记:
P减V加信号量
互斥信号量是1
唤醒进程跳临界
负阻正有0用完
Python中的PV操作相关推荐
- python中的日志操作和发送邮件
1.python中的日志操作 安装log模块:pip install nnlog 参数:my_log = nnlog.Logger('server_log.log',level='debug',bac ...
- 操作系统中的P-V操作(转)
信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为:sem.很显然,我们规定在sem大于等于 ...
- python中二进制文件_Python学习基础篇 -6: Python中的文件操作
前言:本专栏以Python为主题,并尽可能保持每星期两到三更,直到将Python的基础知识浅析和讲解完毕,同时,有一定基础的同学可以移步 Python实战专栏 . 文件有有什么用 文件可以看作一个仓库 ...
- Python中的字符串操作总结(Python3.6.1版本)
Python中的字符串操作(Python3.6.1版本) (1)切片操作: str1="hello world!" str1[1:3] <=> 'el'(左闭右开:即是 ...
- python中文件操作中不同的文件操作有何差异_Python学习基础篇 -6: Python中的文件操作...
前言:本专栏以Python为主题,并尽可能保持每星期两到三更,直到将Python的基础知识浅析和讲解完毕,同时,有一定基础的同学可以移步 Python实战专栏 .文件有有什么用 文件可以看作一个仓库, ...
- Python中的文件操作和异常
Python中的文件操作和异常 文章目录 Python中的文件操作和异常 一.文件 01. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 文本文件和二进制文件 02. 文件的基本操作 ...
- Python中的序列操作
Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...
- python36_第36 p,就这几个方法,Python中文件的操作
大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第X篇文章,第二阶段的课程:Python基础知识:Python中文件的操作(下篇). 学习本课程,建议先看一遍:[计算机基础知识]课 ...
- python中numpy矩阵运算操作大全(非常全)!
python中numpy矩阵运算操作大全(非常全) //2019.07.10晚 python矩阵运算大全 1.矩阵的输出形式: 对于任何一个矩阵,python输出的模板是: import numpy ...
最新文章
- 【硅谷牛仔】当代钢铁侠-特斯拉CEO 埃隆·马斯克
- CentOS系统设置开机自启动
- AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——13:40-14:20毕彦超教授《Knowledge representation in the Human brain》
- [蓝桥杯][2017年第八届真题]拉马车(String)
- arguments 类数组
- makefile 生成.o_要学好 C 语言 / C++ ,Makefile 可少不了
- [分享]iOS 5.0.1 桌面出现 四个白图标 的解决办法!AdSheet FieldTest iOS Diagnostics 设置。...
- Ubuntu开机慢_开机计时1分30秒_A start job is running for dev-disk-by...
- pytorch 查看编号_最完整的PyTorch数据科学家指南(2)
- 内网群PING的shell
- 王阳明:能攻心反侧自消
- 用styler更改样式后,解决数据框中数据无法保留四位小数
- UEBA案例分析系列之数据泄露检测
- BSV上的高效 zk-SNARK:技术解释
- 21条最佳实践,全面保障 GitHub 使用安全
- 区块链资产投资指南及技巧
- EC-PCA: 利润中心主数据维护流程
- Sdwan关于工业控制组网
- 【软件定义汽车】【其他篇】ASPICE--V模型软件开发
- Python入门(安装)——第一个爬虫程序(爬取山东各城市天气信息)