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

 import osimport timeimport randomfrom multiprocessing import Process,Lockdef work(n):print('%s: %s is runing' % (n,os.getpid()))time.sleep(random.random())print('%s: %s is down' % (n, os.getpid()))if __name__ == '__main__':for i in range(3): # 利用for循环模拟多进程p=Process(target=work,args=(i,))p.start()输出结果:
0: 10974 is runing
1: 10975 is runing
2: 10976 is runing
1: 10975 is down
2: 10976 is down
0: 10974 is down

加锁

# 由并发变成了串行,牺牲了运行效率,但避免了竞争
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":1}
# 注意一定要用双引号,不然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(100):    # 模拟并发100个客户端抢票p=Process(target=task)p.start()

加锁

# 文件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(100): # 模拟并发100个客户端p=Process(target=task,args=(lock,))p.start()输出结果:
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
剩余票数:5
购票成功
购票成功
购票成功
购票成功
购票成功
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足
余票不足Process finished with exit code 0

因为只有5张票,因此加锁后只会有5个人买到票,保证了数据的安全性。

python3 进程锁相关推荐

  1. python3 进程

    python3 进程 1.开进程的两种方式: 1. 使用内置的进程 #!/usr/bin/env python #coding:utf-8 #Created by Andy @ 2017/9/17fr ...

  2. 分布式锁,进程锁,线程锁到底是什么

    在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁:大家都不陌生,主要用来给方法.代码块加锁.当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一 ...

  3. 一句话说清分布式锁,进程锁,线程锁

    一句话说清分布式锁,进程锁,线程锁 在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁,进程锁,分布式锁 线程锁:大家都不陌生,主要用来给方法.代码块 ...

  4. python3 多进程锁

    引入库 from multiprocessing import  Lock 初始化 lock = Lock() 上锁 lock.acquire() 解锁 lock.release() 实例: from ...

  5. 并发 --- 31 进程锁 守护进程 进程队列

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

  6. day 31 进程的其他方法 进程锁 进程队列

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

  7. 进程锁 读写文件的小例子 C++代码

    代码 #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sy ...

  8. 正在等待缓存锁:无法获得锁_一句话说清分布式锁,进程锁,线程锁

    推荐阅读 1. Java 性能优化:教你提高代码运行的效率 2. Java问题排查工具清单 3. 记住:永远不要在MySQL中使用UTF-8 4. Springboot启动原理解析 在分布式集群系统的 ...

  9. 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 进程锁(Lock) 锁的基本概念 锁的基本用法 模拟12306抢票软件 信号量:Semaphone 概念 Semaphore ...

最新文章

  1. Hibernate3的配置参数汇总
  2. JavaScript HTML DOM - 改变 CSS
  3. 线程池原理与自定义线程池
  4. docker export_docker使用简介
  5. day 34 守护线程守护进程 互斥锁线程 信号量 生产者消费者
  6. 实战经验:从内存故障到CPU过高诊断-直播预告
  7. python_海龟绘图_坐标系问题_画笔各种方法---python工作笔记013
  8. python语言的官方网站-web2py
  9. Linux文本三剑客超详细教程---grep、sed、awk
  10. 删库跑路mini版!程序员写代码给自己转账21万!判了~
  11. 20. 为包含指针的关联容器指定比较类型
  12. 资源 | 有了这些字体,你的设计也立即“高大上”起来。
  13. Linux内核移植介绍
  14. Springboot集成Activiti7
  15. hustoj mysql_hustoj 管理员和后台设置
  16. dB dBm概念及计算
  17. QQ微信等分享链接时系统提取的标题和图片代码
  18. new joiner
  19. [渝粤教育] 中国地质大学 人力资源开发与管理 复习题 (2)
  20. c# 向Excel文件写入数据(Workbook 和Worksheet )

热门文章

  1. VS2017 使用指南
  2. Myeclipse中英文转换方法
  3. input禁止输入表情!!
  4. 7-27 兔子繁衍问题
  5. Linux中tar,bzip2,gzip压缩命令
  6. redhat7u4 裸机离线安装bzip2(另类安装法)
  7. C++:3类和对象、文件操作
  8. Saolei.net域名从新网转出到Godaddy的过程记录
  9. LAMP搭建owncloud 私有网盘
  10. 怎么把WPS文字自动替换直引号为弯引号?