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内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...
随机推荐
- 2017ACM/ICPC广西邀请赛 1004 Covering
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 学习数据结构Day4
链表 之前看过了动态数组,栈和队列,虽然我们把第一个叫做动态数组,但是,他们的底层实质上还是静态数组.靠 resize来实现动态数组.而链表是真正的数据结构 链表需要一个节点. 数据存储在链表中 相当 ...
- Java spi 和Spring spi
service provider framework是一个系统, 实现了SPI, 在系统里多个服务提供者模块可以提供一个服务的实现, 系统让客户端可以使用这些实现, 从而实现解耦. 一个service ...
- Mybatis @ResultMap复用@Result
@ResultMap复用@Result: 可以简写成:@ResultMap("userMap")
- Java对象深拷贝浅拷贝总结
目录 深拷贝 1. 手动new 2. clone方法 3. java自带序列化 4. json序列化 性能测试 深拷贝总结 浅拷贝 1. spring BeanUtils(Apache BeanUti ...
- Oracle中的dual表简介
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sql代 ...
- MySql取消密码强度验证功能
一.修改MySql配置文件(my.cnf)一般情况下,MySql的配置文件 my.cnf 会在 /etc/ 目录下,如果没有,可以使用以下命令查找位置: find / -name my.cnf 编辑 ...
- core文件问题
core文件问题 Linux系统core涉及到的问题 core文件的问题具体可以参照系统的man手册(man core) 能否生成core文件 ulimit -c 磁盘权限问题 进程权限问题 生成co ...
- 【洛谷 P4070】 [SDOI2016]生成魔咒(后缀自动机)
题目链接 建出\(SAM\)后,不同子串个数就是\(\sum len(i)-len(fa(i))\) 因为\(SAM\)在线的,所以每加入一个字符就能直接加上其贡献,于是这道题就没了. 因为\(x\) ...
- ABAP-Eclipse ADT中创建ABAP CDS视图
Create an ABAP Project in ABAP Development Tools (ADT): https://developers.sap.com/tutorials/abap-cr ...