"""
问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱的问题
"""
'''
进程同步
'''
#多进程抢占输出资源
import os
import time
import random
from multiprocessing import Process def work(n):
print(f'{n}: {os.getpid()} is running')
# time.sleep(random.random())
time.sleep(2)
print(f"{n}: {os.getpid()} is done")
if __name__ == '__main__':
for i in range(3):
p = Process(target= work, args=(i, ))
p.start() #使用锁维护执行顺序 #由并发变成了串行,牺牲了运行效率,但避免了竞争
import os,time,random
from multiprocessing import Process,Lock def work(lock, n):
lock.acquire()
print(f'{n}: {os.getpid()} is running')
time.sleep(random.randint(1, 3))
print(f'{n}: {os.getpid()} is done')
lock.release() if __name__ == '__main__':
lock = Lock()
for i in range(3):
p = Process(target=work, args=(lock, i))
p.start()
'''加锁可以实现顺序的执行,但是程序又重新变成串行了,
浪费时间但是保证了数据安全
'''
#文件db的内容为:{"count": 1}
#注意一定要用双引号,不然json无法识别
#并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process,Lock
import time, json, random def search():#查询剩余票数
dic = json.load(open('db')) #从文件中把数据读出来
# 下面两句和上面一句的功能一样
# data = open('db')
# dic = json.load(data)
print(f'剩余票数{dic["count"]}')#打印
def get():#买票
dic = json.load(open('db')) #打开文件
time.sleep(0.1) #模拟读数据的网络延迟
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic, open('db', 'w'))
# 下面两句和上面一句会得到相同的效果
# data = open('db', 'w')
# json.dump(dic, data)
print('购票成功')
def task():
search()
get() if __name__ == '__main__':
for i in range(100): # 模拟并发100个客户端抢票
p = Process(target=task)
p.start() #用锁来保证数据安全
from multiprocessing import Process,Lock
import time, json, random def search():#查询剩余票数
dic = json.load(open('db')) #从文件中把数据读出来
# 下面两句和上面一句的功能一样
# data = open('db')
# dic = json.load(data)
print(f'剩余票数{dic["count"]}')#打印
def get():#买票
dic = json.load(open('db')) #打开文件
time.sleep(random.random()) #模拟读数据的网络延迟
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(random.random()) #模拟写数据的网络延迟
json.dump(dic, open('db', 'w'))
# 下面两句和上面一句会得到相同的效果
# data = open('db', 'w')
# json.dump(dic, data)
print('购票成功')
def task(lock):
search()
lock.acquire()
get()
lock.release() if __name__ == '__main__':
lock = Lock()
for i in range(30): # 模拟并发30个客户端抢票
p = Process(target=task, args=(lock, ))
p.start()
"""
加锁可以保证多个进程修改同一块数据时,同一时间只
能有一个任务可以修改即串行的修改,速度慢了,但是数
据变安全了。 文件共享数据实现进程间通信,问题有:
1.效率低(共享数据基于文件,而文件是在硬盘上的数据)
2.需要自己加锁处理 我们需要:
1.效率高,(多个进程共享一块内存的数据)
2.帮我们处理好锁问题,这就是multiprocessing模块提供
的基于消息的IPC通信机制:队列和管道 注意:
队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)
实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量
避免使用共享数据,尽可能使用消息传递和队列,避免处理复
杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。 """

最新文章

  1. 关于Linux下转换oracle字符集
  2. git使用相关文章的链接
  3. JavaOOP项目 CMS内容管理系统
  4. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
  5. C# 数组CopyTo
  6. JAVA 抛出与声明异常
  7. 谓词--Predicate
  8. 打工心态废掉了很多人,包括你吗?(你把现在这家公司的业务都弄清楚、弄懂了吗?君子报仇十年不晚!不离不弃!)good
  9. 7.广播和多播,IGMP协议
  10. Spring Cloud 客服端负载均衡 Ribbon
  11. Android下DrawerLayout的使用
  12. Java基础系列--HashMap(JDK1.8)
  13. Makedown
  14. jq常用操作
  15. My_SQ主键,外键
  16. Mysql清空表(truncate)与删除表中数据(delete)的区别
  17. Spring Cloud 与 Dubbo、Spring Cloud 与 Docker、Spring Cloud 与 Kubernetes 比较
  18. python3 调用 salt-api
  19. leetcode91
  20. 日历时间选择控件---3(支持ie、火狐)

热门文章

  1. Jena Fuseki安装完成后不能添加数据库
  2. [Powershell]使用Msbuild构建基于.NET Framework的WebAPI项目
  3. CentOS7 Hadoop 安装(完全分布式)
  4. 通过Windows实现端口转发
  5. Mac应用程序无法打开,提示不明开发者或文件损坏的处理方法
  6. 提高性能,MySQL 读写分离环境搭建
  7. python学习--大数据与科学计算第三方库简介
  8. 官方elasticsearch-certutiledit命令
  9. C# 与 Java 的一些差异
  10. mvc5 源码解析2-1:mvchandler的执行