使用原因

多进程抢占资源
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。

示例

# 由并发变成了串行,牺牲了运行效率,但避免了竞争
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 进程锁使用相关推荐

  1. Python 进程互斥锁 Lock - Python零基础入门教程

    目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...

  2. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

  3. python守护进程去中断子进程_04 Python并发编程(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  4. python并发编程之进程1(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  5. Python 进程池与进程锁

    #coding:utf-8import time import os import multiprocessingdef work(count):print(count,',进程id:',os.get ...

  6. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  7. php 线程锁,如何使用python线程锁(实例解析)

    在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...

  8. python进程、线程的学习心得

    什么是多线程竞争? 线程不是独立的,同一个进程里的线程,线程间的数据是共享的,多线程操作时,容易造成数据的混乱,线程不安全. 如何解决? 互斥锁. 好处:能够保证某段关键代码执行时,只有一个线程操作, ...

  9. python进程、线程、协程

    基本观点: 1.一个python进程一个GIL(全局锁),每个线程需要获取这个锁才能执行. 2.cpu密集型的程序,使用多进程. 3.IO密集型的程序,多线程可能会比多进程快. 4.多核cpu执行多进 ...

最新文章

  1. 【好用的.vimrc】支持vim语法高亮,保留上一次编辑内容,记住位置等配置
  2. 用MacBook对交换机进行初始化配置
  3. EasyGui的用法简介
  4. vue深究第一弹:computed与watch的异同
  5. Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)
  6. js接收springmvc传过来的数据_Java修行第072天 ---SpringMVC(中)
  7. Ext.form.field.Spinner微调字段
  8. Linux关闭密码登录
  9. 高中计算机会考基本知识点,高中计算机会考基本知识点
  10. android 互传文件,堪比隔空投送!iPhone和安卓、PC互传文件的3种方法,建议收藏...
  11. 【ENVI】FLAASH大气校正工具中比例因子说明
  12. 暂停影片剪辑_暂停声音剪辑
  13. c语言 打印奇数魔法阵,[luogu2119]魔法阵 NOIP2016T4
  14. 计算机两个硬盘如何区分,双硬盘电脑怎么设置主从盘?
  15. 【记录】游戏体验报告怎么写(自我成长篇)
  16. zabbix web 检测
  17. drv10893器件的使用
  18. jmeter 跳板机_jmeter本地通过跳板机连接塔内数据库
  19. html5svg地图api,提取 ECharts 中的svg地图信息
  20. 1.决策技术解析与实现

热门文章

  1. 最简易上手的numpy学习笔记二
  2. Adobe illustrator 调整对象大小 - 连载 11
  3. Yep for Mac:专为Mac用户所设计的文档管理工具
  4. android studio 设置自动编译_Appium Mac系统 自动测试环境搭建
  5. 可以批量修改文件名、文件后缀的实用工具
  6. 大学生换学校学计算机,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
  7. mysql 毫秒比较_MYSQL的毫秒级时间比较问题
  8. 分区界限必须调整为高于最后一个分区界限_不花一分钱,为SSD硬盘腾空间
  9. thinkPHP 阿里云OSS 上传文件、直接下载
  10. c# list集合根据某个字段去重_Python list、dataframe去重