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内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...
随机推荐
- watchdog监控文件变化使用总结——转载
原文链接地址:https://blog.csdn.net/xufive/article/details/93847372 概述 首先声明,本文讨论的 watchdog,不是单片机里的 watchdog ...
- Python 爬取陈都灵百度图片
Python 爬取陈都灵百度图片 标签(空格分隔): 随笔 今天意外发现了自己以前写的一篇爬虫脚本,爬取的是我的女神陈都灵,尝试运行了一下发现居然还能用.故把脚本贴出来分享一下. import req ...
- 我在LeetCode的首次刷题
到现在为止,我才发现我的博客一篇感受,心得,体会之言都没有. 今天就来随便扯扯. 刷题,是我最近一直在干的事情.也就每天写一两个.忘了就没写这种.也收藏了好几个刷题网站,当然第一次接触肯定是 WUST ...
- MyBatis框架的详解
一.MyBatis的介绍 在使用的时候,需要配置文件的方式告知框架需要的信息,多数会使用XML文件作为框架的配置文件. 框架都是由第三方提供的,提供的都是jar包.因此,使用框架前,必须将框架涉及的j ...
- JAVA day1 基础知识
一.windows命令 dir:查看文件 cd:打开文件 二.java的编译和运行 编译: javac 源文件名 一个类编译后会对应一个.class文件 运行: java 类名 三.类 一个源文件内可 ...
- HTML5单页框架View.js介绍
什么是单页应用单页应用,是指将用户视觉上的多个页面在技术上使用一个载体来实现的应用. 换句话来讲,用户视觉效果,与技术实现的载体,并不是一定要一一对应的.采取哪种技术方案,取决于产品设计.技术组成以及 ...
- zookerper入门、核心概念和使用场景
zookeeper是一个分布式程序的高性能协调服务,提供集中式信息存储服务,数据存储于内存中,类似文件系统的树形结构,高吞吐量和低延时,集群高可靠,基于zookeeper可以实现分布式统一配置中心.分 ...
- ubuntu ufw 配置
ubuntu ufw 配置 Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: 1 sudo apt install ...
- 下载css-loader 安装及使用
1.通过require的方式来引入css,我们来看具体的方法,首先需要安装css-loader, style-loader(安装style-loader的目的是为了在html中以style的方式嵌入c ...
- 视觉AI风口一触即发,虹软AI沙龙点金深圳
7月26日,虹软AI沙龙在深圳湾科技生态园空间举办.AI沙龙是基于虹软视觉开放平台的开发者交流沙龙,旨在通过分享最新的实战案例,帮助开发者解决技术及落地难题,让技术更贴近实用场景. 本次活动中,深圳市 ...