1. """
  2. 问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱的问题
  3. """
  4. '''
  5. 进程同步
  6. '''
  7. #多进程抢占输出资源
  8. import os
  9. import time
  10. import random
  11. from multiprocessing import Process
  12. def work(n):
  13. print(f'{n}: {os.getpid()} is running')
  14. # time.sleep(random.random())
  15. time.sleep(2)
  16. print(f"{n}: {os.getpid()} is done")
  17. if __name__ == '__main__':
  18. for i in range(3):
  19. p = Process(target= work, args=(i, ))
  20. p.start()
  21. #使用锁维护执行顺序
  22. #由并发变成了串行,牺牲了运行效率,但避免了竞争
  23. import os,time,random
  24. from multiprocessing import Process,Lock
  25. def work(lock, n):
  26. lock.acquire()
  27. print(f'{n}: {os.getpid()} is running')
  28. time.sleep(random.randint(1, 3))
  29. print(f'{n}: {os.getpid()} is done')
  30. lock.release()
  31. if __name__ == '__main__':
  32. lock = Lock()
  33. for i in range(3):
  34. p = Process(target=work, args=(lock, i))
  35. p.start()
  36. '''加锁可以实现顺序的执行,但是程序又重新变成串行了,
  37. 浪费时间但是保证了数据安全
  38. '''
  39. #文件db的内容为:{"count": 1}
  40. #注意一定要用双引号,不然json无法识别
  41. #并发运行,效率高,但竞争写同一文件,数据写入错乱
  42. from multiprocessing import Process,Lock
  43. import time, json, random
  44. def search():#查询剩余票数
  45. dic = json.load(open('db')) #从文件中把数据读出来
  46. # 下面两句和上面一句的功能一样
  47. # data = open('db')
  48. # dic = json.load(data)
  49. print(f'剩余票数{dic["count"]}')#打印
  50. def get():#买票
  51. dic = json.load(open('db')) #打开文件
  52. time.sleep(0.1) #模拟读数据的网络延迟
  53. if dic['count'] > 0:
  54. dic['count'] -= 1
  55. time.sleep(0.2) #模拟写数据的网络延迟
  56. json.dump(dic, open('db', 'w'))
  57. # 下面两句和上面一句会得到相同的效果
  58. # data = open('db', 'w')
  59. # json.dump(dic, data)
  60. print('购票成功')
  61. def task():
  62. search()
  63. get()
  64. if __name__ == '__main__':
  65. for i in range(100): # 模拟并发100个客户端抢票
  66. p = Process(target=task)
  67. p.start()
  68. #用锁来保证数据安全
  69. from multiprocessing import Process,Lock
  70. import time, json, random
  71. def search():#查询剩余票数
  72. dic = json.load(open('db')) #从文件中把数据读出来
  73. # 下面两句和上面一句的功能一样
  74. # data = open('db')
  75. # dic = json.load(data)
  76. print(f'剩余票数{dic["count"]}')#打印
  77. def get():#买票
  78. dic = json.load(open('db')) #打开文件
  79. time.sleep(random.random()) #模拟读数据的网络延迟
  80. if dic['count'] > 0:
  81. dic['count'] -= 1
  82. time.sleep(random.random()) #模拟写数据的网络延迟
  83. json.dump(dic, open('db', 'w'))
  84. # 下面两句和上面一句会得到相同的效果
  85. # data = open('db', 'w')
  86. # json.dump(dic, data)
  87. print('购票成功')
  88. def task(lock):
  89. search()
  90. lock.acquire()
  91. get()
  92. lock.release()
  93. if __name__ == '__main__':
  94. lock = Lock()
  95. for i in range(30): # 模拟并发30个客户端抢票
  96. p = Process(target=task, args=(lock, ))
  97. p.start()
  98. """
  99. 加锁可以保证多个进程修改同一块数据时,同一时间只
  100. 能有一个任务可以修改即串行的修改,速度慢了,但是数
  101. 据变安全了。
  102. 文件共享数据实现进程间通信,问题有:
  103. 1.效率低(共享数据基于文件,而文件是在硬盘上的数据)
  104. 2.需要自己加锁处理
  105. 我们需要:
  106. 1.效率高,(多个进程共享一块内存的数据)
  107. 2.帮我们处理好锁问题,这就是multiprocessing模块提供
  108. 的基于消息的IPC通信机制:队列和管道
  109. 注意:
  110. 队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)
  111. 实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量
  112. 避免使用共享数据,尽可能使用消息传递和队列,避免处理复
  113. 杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。
  114. """

Python并发编程之进程同步的更多相关文章

  1. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  2. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  3. Python并发编程的几篇文章

    Python几种并发实现方案的性能比较 http://www.elias.cn/Python/PyConcurrency?from=Develop.PyConcurrency python并发编程 h ...

  4. Python并发编程之深入理解yield from语法(八)

    大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...

  5. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  6. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  7. Python并发编程一(多进程)

    1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...

  8. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  9. Python并发编程系列之多线程

    1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...

随机推荐

  1. 使用 Java 执行 groovy 脚本或方法

    1. 引入依赖 <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groo ...

  2. 用Python搞定九宫格式的朋友圈。内附“马云”朋友圈

    PIL(Python Imaging Library)是一个非常强大的Python库,但是它支持Python2.X, 在Python3中则使用的是Pillow库,它是从PIL中fork出来的一个分支. ...

  3. mysql,字符串类型id,获取最大值

    说明,这个id是字符串类型,但是实际值是一个整数,获取最大值的方法是: select max(cast(id as SIGNED)) from table 另外,mysql生成伪列的方法: SELEC ...

  4. FutureTask源码2

    @SuppressWarnings({"unchecked","restriction"}) public class FutureTask1<V> ...

  5. JAVA Api 调用Hbase报错锦集

    1. 报错 java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/MasterProtos$Master ...

  6. [转帖]分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...

  7. centos7.x下环境搭建(五)—nginx搭建https服务

    https证书获取 十大免费SSL证书 https://blog.csdn.net/ithomer/article/details/78075006 如果我们用的是阿里云或腾讯云,他们都提供了免费版的 ...

  8. 【转】常用PLC通讯协议

    三菱FX系列PLC通讯测试 发送帧(Hex): 起始(STX) 02 命令(CMD) 30 首地址(ADDRESS) 30 30 41 30 字节数(BYTES) 30 31 终止(ETX) 03 校 ...

  9. [转] JS中arr.forEach()如何跳出循环

    我们都知道for循环里要跳出整个循环是使用break,但在数组中用forEach循环如要退出整个循环呢?使用break会报错,使用return也不能跳出循环. 使用break将会报错: var arr ...

  10. 2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比

    原文:2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比 title author date CreateT ...