Python并发编程之进程同步
"""
问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱的问题
"""
'''
进程同步
'''
#多进程抢占输出资源
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通信机制:队列和管道
注意:
队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)
实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量
避免使用共享数据,尽可能使用消息传递和队列,避免处理复
杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。
"""
Python并发编程之进程同步的更多相关文章
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- Python并发编程的几篇文章
Python几种并发实现方案的性能比较 http://www.elias.cn/Python/PyConcurrency?from=Develop.PyConcurrency python并发编程 h ...
- Python并发编程之深入理解yield from语法(八)
大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...
- 自学Python之路-Python并发编程+数据库+前端
自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python并发编程一(多进程)
1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
随机推荐
- 分布式事物解决方案-TCC
分布式框架下,如何保证事物一致性一直是一个热门话题.当然事物一致性解决方案有很多种(请参考:分布式事物一致性设计思路),我们今天主要介绍TCC方案解决的思路.以下是参与设计讨论的一种解决思路,大家有问 ...
- ConcurrentHashMap竟然也有死循环问题?
前几天和朋友闲聊,说遇到了一个ConcurrentHashMap死循环问题,当时心里想这不科学呀?ConcurrentHashMap怎么还有死循环呢,毕竟它已经解决HashMap中rehash中死循环 ...
- EventBus原理解析
前言 EventBus的核心思想是观察者模式 (生产/消费者编程模型) . SpringBoot+EventBus使用教程(一) SpringBoot+EventBus使用教程(二) 通过前面的文章我 ...
- 动手学深度学习4-线性回归的pytorch简洁实现
导入同样导入之前的包或者模块 生成数据集 通过pytorch读取数据 定义模型 初始化模型 定义损失函数 定义优化算法 训练模型 小结 本节利用pytorch中的模块,生成一个更加简洁的代码来实现同样 ...
- CF 715 E. Complete the Permutations
CF 715 E. Complete the Permutations 题目大意:给定两个排列\(p,q\)的一部分.定义两个排列\(p,q\)的距离为使用最少的交换次数使得\(p_i=q_i\).对 ...
- 论文阅读: Infrastructure-Based Calibration of a Multi-Camera Rig
Abstract 在线标定很重要. 但是目前的方法都计算量都很高. 我们的方案不需要标定板之类的东西. 我们的方案不需要假设相机有重合的FOV,也不需要任何的初始猜测. 当相机模组行驶穿过之前建过地图 ...
- Android添加新按键
1.前言 在Android开发中可能会遇到添加新的按键的需求,本文将简单介绍如何在Android系统中完成一个新的按键的添加. 当系统有新的按键需要添加时,Linux内核下的键码到Android系统中 ...
- .tar.gz 文件和 .tar.xz 文件的区别
tar.gz and tar.xz both are compressed tar-files, but with different compression methods. tar.gz is c ...
- 宽字符与Unicode (c语言 汉语字符串长度)
在C语言中,我们使用char来定义字符,占用一个字节,最多只能表示128个字符,也就是ASCII码中的字符.计算机起源于美国,char 可以表示所有的英文字符,在以英语为母语的国家完全没有问题. 但是 ...
- 理解 Virtual DOM(摘)及评价
框架并没有提高web的性能,只是让开发者更加专注的完成业务逻辑,而不用过渡的考虑性能上的优化.如果以性能来比的话,框架是绝对比不过优化后的原生代码的. 二.什么是Virtual DOM Virtual ...