Python 进程锁使用
使用原因
多进程抢占资源
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
示例
# 由并发变成了串行,牺牲了运行效率,但避免了竞争
import os
import time
import random
from multiprocessing import Process,Lockdef work(lock,n):lock.acquire()print('%s: %s is runing' % (n,os.getpid()))time.sleep(random.random())print('%s: %s is down' % (n, os.getpid()))lock.release()if __name__ == '__main__':lock = Lock()for i in range(3):p=Process(target=work,args=(lock,i))p.start()输出结果:
0: 10986 is runing
0: 10986 is down
1: 10987 is runing
1: 10987 is down
2: 10988 is runing
2: 10988 is down
上面这种情况虽然使用加锁的形式实现了顺序的执行,但是程序又重新变成串行了,这样确实会浪费了时间,却保证了数据的安全。这个过程类似于数据库的事务
例子:模拟抢票
没有加锁的情况,虽然实现了并发,但是数据不安全,本来只有一张票,但是还是会有多个人抢到,这显然不符合现实
# 文件db的内容为:{"count":2}
# 注意一定要用双引号,不然json无法识别
# 并发运行,效率高,但竞争写同一文件,数据写入错乱from multiprocessing import Process
import time,json,randomdef search():dic = json.load(open('db'))print('\033[43m剩余票数%s\033[0m' % dic['count'])def get():dic = json.load(open('db'))time.sleep(0.1) # 模拟读数据延迟if dic['count'] > 0:dic['count'] -= 1time.sleep(0.2) # 模拟写数据延迟json.dump(dic,open('db','w'))print('\033[43m购票成功\033[0m')def task():search()get()if __name__ == '__main__':for i in range(10): # 模拟并发10个客户端抢票p=Process(target=task)p.start()剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
剩余票数2
购票成功
购票成功
购票成功
购票成功
购票成功
购票成功
购票成功
购票成功
购票成功
购票成功
加锁
# 文件db的内容为:{"count":5}
# 注意一定要用双引号,不然json无法识别
# 并发运行,效率高,但竞争写同一文件,数据写入错乱from multiprocessing import Process,Lock
import time,json,randomdef search():dic=json.load(open('db'))print('\033[43m剩余票数:%s\033[0m' % dic['count'])def get():dic=json.load(open('db'))time.sleep(random.random()) # 模拟读数据的网络延迟if dic['count'] > 0:dic['count'] -= 1time.sleep(random.random()) # 模拟写数据的网络延迟json.dump(dic,open('db','w'))print('\033[43m购票成功\033[0m')else:print('\033[43m余票不足\033[0m')def task(lock):search()lock.acquire()get()lock.release()if __name__ == '__main__':lock=Lock()for i in range(10): # 模拟并发10个客户端p=Process(target=task,args=(lock,))p.start()剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
购票成功
购票成功
购票成功
购票成功
购票成功
余票不足
余票不足
余票不足
余票不足
余票不足
因为只有5张票,因此加锁后只会有5个人买到票,保证了数据的安全性。
Python 进程锁使用相关推荐
- Python 进程互斥锁 Lock - Python零基础入门教程
目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...
- python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...
- python守护进程去中断子进程_04 Python并发编程(守护进程,进程锁,进程队列)
进程的其他方法 P = Process(target=f,) P.Pid 查看进程号 查看进程的名字p.name P.is_alive() 返回一个true或者False P.terminate( ...
- python并发编程之进程1(守护进程,进程锁,进程队列)
进程的其他方法 P = Process(target=f,) P.Pid 查看进程号 查看进程的名字p.name P.is_alive() 返回一个true或者False P.terminate( ...
- Python 进程池与进程锁
#coding:utf-8import time import os import multiprocessingdef work(count):print(count,',进程id:',os.get ...
- Python进程、线程、协程详解
进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...
- php 线程锁,如何使用python线程锁(实例解析)
在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...
- python进程、线程的学习心得
什么是多线程竞争? 线程不是独立的,同一个进程里的线程,线程间的数据是共享的,多线程操作时,容易造成数据的混乱,线程不安全. 如何解决? 互斥锁. 好处:能够保证某段关键代码执行时,只有一个线程操作, ...
- python进程、线程、协程
基本观点: 1.一个python进程一个GIL(全局锁),每个线程需要获取这个锁才能执行. 2.cpu密集型的程序,使用多进程. 3.IO密集型的程序,多线程可能会比多进程快. 4.多核cpu执行多进 ...
最新文章
- 【好用的.vimrc】支持vim语法高亮,保留上一次编辑内容,记住位置等配置
- 用MacBook对交换机进行初始化配置
- EasyGui的用法简介
- vue深究第一弹:computed与watch的异同
- Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)
- js接收springmvc传过来的数据_Java修行第072天 ---SpringMVC(中)
- Ext.form.field.Spinner微调字段
- Linux关闭密码登录
- 高中计算机会考基本知识点,高中计算机会考基本知识点
- android 互传文件,堪比隔空投送!iPhone和安卓、PC互传文件的3种方法,建议收藏...
- 【ENVI】FLAASH大气校正工具中比例因子说明
- 暂停影片剪辑_暂停声音剪辑
- c语言 打印奇数魔法阵,[luogu2119]魔法阵 NOIP2016T4
- 计算机两个硬盘如何区分,双硬盘电脑怎么设置主从盘?
- 【记录】游戏体验报告怎么写(自我成长篇)
- zabbix web 检测
- drv10893器件的使用
- jmeter 跳板机_jmeter本地通过跳板机连接塔内数据库
- html5svg地图api,提取 ECharts 中的svg地图信息
- 1.决策技术解析与实现
热门文章
- 最简易上手的numpy学习笔记二
- Adobe illustrator 调整对象大小 - 连载 11
- Yep for Mac:专为Mac用户所设计的文档管理工具
- android studio 设置自动编译_Appium Mac系统 自动测试环境搭建
- 可以批量修改文件名、文件后缀的实用工具
- 大学生换学校学计算机,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
- mysql 毫秒比较_MYSQL的毫秒级时间比较问题
- 分区界限必须调整为高于最后一个分区界限_不花一分钱,为SSD硬盘腾空间
- thinkPHP 阿里云OSS 上传文件、直接下载
- c# list集合根据某个字段去重_Python list、dataframe去重