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内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...
随机推荐
- CSP2019-终章:afo生活的开始
出分了...退役了...449...afo了... 曾经立志不少于500的我...竟然450都没上... Orz初中的神仙学弟考了596... 接下来,是一种生活的结束,也是另一种生活的开始... 我 ...
- 2019 西安邀请赛 M
Problem Description There are n planets ∼n. Each planet is connected to other planets through some t ...
- Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引
声明在前面 总结就是 不能单纯说 走和不走,需要看数据库版本,数据量等 ,希望不要引起大家的误会,也不要被标题党误导了. 1 数据库版本: 2 建表语句 CREATE TABLE s1 ( id IN ...
- [转帖]微软宣布加入 OpenJDK 项目
微软宣布加入 OpenJDK 项目 https://news.cnblogs.com/n/646003/ 近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含 ...
- Linux中进行jdk的安装+Tomcat安装+mysql的安装
1.上传所需要的文件(这里事先准备好了jdk和tomcat的安装包,mysql需要在线安装) jdk的安装包名称:jdk-8u151-linux-x64.tar.gz tomcat 的安装包名称:ap ...
- 基于全志a33-vstar开发板的ap6210WiFi模块移植
可以去链接看更详细的,第一次用博客,这个编辑方式太不友好了. 文档:全志a33--系统移植--ap6210WiFi模块移?..链接:http://note.youdao.com/noteshare?i ...
- struct,interface,method
struct类型,值传递的 声明 struct { name string age int } //几种声明使用方式: var P person // P现在就是person类型的变量了 P.name ...
- JAVA day2 语言基础
一.注释 描述代码的文字 1.// 单行注释 2./* */ 多行注释 (多行注释中不能再嵌套多行注释) 3./** */ 多行注释 配合JavaDoc工具使用(只可以看到注释,看不到代码 ...
- 雪花算法,生成分布式唯一ID
2.3 基于算法实现 [转载] 这里介绍下Twitter的Snowflake算法——snowflake,它把时间戳,工作机器id,序列号组合在一起,以保证在分布式系统中唯一性和自增性. snowfla ...
- 使用jQuery开发tab选项卡插件(可以右键关闭多个标签)
在前一篇“使用jQuery开发tab选项卡插件”的基础上添加了tab标签右键关闭菜单功能,菜单主要包括:关闭当前标签.关闭左侧标签.关闭右侧标签.关闭其他.关闭全部. 一.插件效果 二.实现思路 为w ...