多进程模拟买票~

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_并发编程——锁的更多相关文章

  1. java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock

    原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...

  2. Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  3. Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  4. Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  5. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  6. python_并发编程——管道

    1.管道 from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值 conn1.send('wdc') #发送 print(conn2. ...

  7. python_并发编程——进程池

    1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...

  8. 并发编程--锁--Lock和Synchronized

    说说对于 synchronized 关键字的了解? synchronized关键字解决的是多个线程之间访问资源的同步性: synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能 ...

  9. 并发编程--锁--volatile

    在讲volatile关键字之前我们先了解Java的内存模型,Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...

随机推荐

  1. leetocode 207 课程表

    解题思路: 本题可约化为:课程安排图是否是 有向无环图(DAG).即课程间规定了前置条件,但不能构成任何环路,否则课程前置条件将不成立. 思路是通过 拓扑排序 判断此课程安排图是否是 有向无环图(DA ...

  2. 用外部按钮打开DATETIMEPICKER下拉日期选择窗口

    https://www.cnblogs.com/gaodu2003/archive/2009/08/10/1543115.html 方法一: SendMessage(DateTimePicker1.H ...

  3. 升级nginx1.12为1.161版本

    升级nginx1.12为1.161版本 一.添加源 到 cd /etc/yum.repos.d/ 目录下 新建nginx.repo 文件 vim nginx.repo 输入以下信息 [nginx-st ...

  4. web页面元素定位

    所有web网页中有8种元素定位方式 靠单一的特征找元素:6种(id,class_name,tag_name,name,link_text(2))组合各种特征和关系来找元素:2种(xpath,css) ...

  5. golang方法和函数的区别

  6. maven打包spring boot项目及跳过test文件

    打包命令 mvn clean package // 会先清理现有的target目录 or mvn package 跳过测试文件 1. idea全局配置 右侧maven会取消test选项 2. 命令行附 ...

  7. Jmeter_数据库

    1.准备一个有测试数据表的mysql数据库 2.在测试计划面板点击“浏览..." 按钮,将你的JDBC驱动添加进来.         需要安装插件   mysql-connector-jav ...

  8. python --- 字符编码学习小结(二)

    距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常.这种方法显然是不科学 ...

  9. FireWolf OS X PE

    FireWolf OS X PE FireWolf OS X PE 9 使用手册   https://pe.firewolf.app/manual/ https://pe.firewolf.app/m ...

  10. git便携版 添加git-bash到右键菜单

    注册表路径 HKEY_CLASSES_ROOT\Directory\Background\shell 新建项取名open in git 默认设置为右键显示的名称 Git Bash Here 新建字符串 ...