python_并发编程——锁
多进程模拟买票~
import time
import json
from multiprocessing import Process class Show(Process): #查
def run(self):
with open('ticket') as f:
dic = json.load(f)
print("余票:{}".format(dic['ticket'])) class Buy_ticket(Process): #买
def __init__(self,name):
super().__init__()
self.name = name
def run(self):
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1) #模拟网络延迟
if dic['ticket'] > 0:
dic['ticket'] -=1
print('{}买到票了~~~'.format(self.name))
time.sleep(0.1) #模拟网络延迟
with open('ticket','w') as f:
json.dump(dic,f)
else:
print('{}没买到票!!!'.format(self.name))
if __name__ == '__main__':
for i in range(10):
q1 = Show()
q1.start()
for i in range(10):
i = str(i)
q2 = Buy_ticket(i)
q2.start()
json文件:
结果:
余票为1却有两个人买到票了~。
加上锁之后
import time
import json
from multiprocessing import Process
from multiprocessing import Lock class Show(Process): #查
def run(self):
with open('ticket') as f:
dic = json.load(f)
print("余票:{}".format(dic['ticket'])) class Buy_ticket(Process): #买
def __init__(self,name,lock): #接收锁对象
super().__init__()
self.name = name
self.lock = lock
def run(self):
self.lock.acquire() #拿钥匙进门
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1) #模拟网络延迟
if dic['ticket'] > 0:
dic['ticket'] -=1
print('{}买到票了~~~'.format(self.name))
time.sleep(0.1) #模拟网络延迟
with open('ticket','w') as f:
json.dump(dic,f)
else:
print('{}没买到票!!!'.format(self.name))
self.lock.release() #还钥匙
if __name__ == '__main__':
for i in range(10):
q1 = Show()
q1.start()
lock = Lock() #实例化一个锁对象
for i in range(10):
i = str(i)
q2 = Buy_ticket(i,lock) #将锁对象传入子进程
q2.start()
json文件:
结果:
就只有三个人买到了~~
信息量:实现限定进程(大于1)数量访问代码。
import time
import random
from multiprocessing import Process
from multiprocessing import Semaphore class Ktv(Process):
def __init__(self,name,sem):
super().__init__()
self.name = name
self.sem = sem def run(self):
self.sem.acquire() #获取钥匙
print('{}走进了KTV'.format(self.name))
time.sleep(random.randint(10,20)) #随机暂停10-20秒
print('{}走出了KTV'.format(self.name))
self.sem.release() #还钥匙 if __name__ == '__main__':
sem = Semaphore(4) #实例化,实例化的同时设置信息量
for i in range(20):
name = str(i) #将信息量的对象传递进子进程
q = Ktv(name,sem)
q.start()
结果:
开始进去4个后,只能出了一个再进去一个。
python_并发编程——锁的更多相关文章
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- Java并发编程锁系列之ReentrantLock对象总结
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...
- Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
(1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...
- python_并发编程——管道
1.管道 from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值 conn1.send('wdc') #发送 print(conn2. ...
- python_并发编程——进程池
1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...
- 并发编程--锁--Lock和Synchronized
说说对于 synchronized 关键字的了解? synchronized关键字解决的是多个线程之间访问资源的同步性: synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能 ...
- 并发编程--锁--volatile
在讲volatile关键字之前我们先了解Java的内存模型,Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...
随机推荐
- java web中的相对路径和绝对路径
以往一直没注意javaweb中的相对路径和绝对路径问题,有时有问题了,才想起去看看是否是路径的问题,一直对路径问题都是一知半解.今天就姑且记录一下,毕竟事如春梦了无痕嘛,倘不记之笔墨,未免有辜彼苍之厚 ...
- SpringBoot常用注解(一)
控制层:controller 1.@RestController注解相当于@ResponseBody + @Controller合在一起的作用.即这样写每一个方法返回的是 JSON 类型的数据. 2. ...
- 根据GSVA结果绘制不同组的趋势图
首先需要将GSVA的矩阵结果转换成如下格式: 然后使用如下代码进行作图 infile <- "draw_pre_violin_heatmap.txt" data <- ...
- TCP/IP学习笔记2--协议分层与OSI参考模型
协议的分层: 为解决不同计算机之间的通信,ISO(International Organization for Standards)指定了一个国际标准OSI(Open Systems Intercon ...
- npm包的语义版本控制(Semantic Versioning of Packages)
本文删改自Node.js 8 the Right Way Part I Chapter 3 npm 使用语义版本控制(SemVer)来寻找包的最佳可用兼容版本. 以安装测试框架mocha为例 $ ...
- SpringBoot整合AbstractRoutingDataSource实现读写分离
在配置数据源时候,已经把主库和从库的数据源配置到DynamicDataSource里了 利用AbstractRoutingDataSource实现动态切换数据源,可以通过注解或者根据方法名前缀切换要使 ...
- Redhat7.6Linux本地的yum源配置
安装好虚拟机,配置Ip地址,见博客https://www.cnblogs.com/xuzhaoyang/p/11264573.html 我是使用的Xshell在外部链接进行的操作,比较简单,见博客ht ...
- 100天搞定机器学习|Day55 最大熵模型
1.熵的定义 熵最早是一个物理学概念,由克劳修斯于1854年提出,它是描述事物无序性的参数,跟热力学第二定律的宏观方向性有关:在不加外力的情况下,总是往混乱状态改变.熵增是宇宙的基本定律,自然的有序状 ...
- PXC增量恢复添加节点(IST)
绕开SST通过IST方式添加Node到Percona XtraDB Cluster Gcache存储了所有的 writeset ,因此说这个集合的大小直接决定了允许其他节点宕机后多长时间内可以进行 ...
- JavaScript中的原型prototype和__proto__的区别及原型链概念
问题 初学js的同学,总是搞不清楚js中的原型是什么东西,看着控制台打印出来的一串串__proto__,迷惑不已. 例如我定义一个Person,创建一个实例p,并打印实例. function Pers ...