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中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
随机推荐
- 路径规划基础A*算法
1,Dijkstra’s 算法 一种发散性寻找最短路径算法. 由起点开始向四周开始发散,直到碰到目标点为止.这时就是最短路径.优点:能找到与目标点的最短路径:缺点:搜索花费的时间会比较长. 2,Gr ...
- Server SQL2008对文件的基础操作—01
1.一个文件的基本框架为:文件名.文件地址.文件大小.文件最大的大小.文件的增量(Filegrowth). 2.文件有mdf.ndf.ldf 三种文件的区别. 3.文件组可以进行文件的管理 FileG ...
- golang学习笔记 ---slice
Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一 ...
- 【转】西门子PLC以太网 通讯协议 解析
一直想把三菱和西门子这两个使用频率最高的PLC上位通讯,融合到WCS系统的框架里: 现在三菱主流使用Q系列,使用的是MC协议, 前一段时间也写过一个入门介绍: 三菱Q系列通讯方式设计说明 去年8月份, ...
- Nacos配置中心
本文介绍spring cloud 集成 nacos案例 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh ...
- NoSql的对比以及键值对的存储方式(为什么速度特别快)
什么是NoSql NoSQL(Not Only SQL),泛指非关系型的数据库,是对不同于传统的关系型数据库的数据库管理系统的统称,强调Key-Value Stores和文档数据库的优点.为了解决大规 ...
- Git 版本及版本范围表示法
很多 Git 命令都使用 revision(修订版本)作为参数.根据不同的命令,有时候 revision 参 数代表一个特定的提交,有时候代表某一个提交可以追踪到的所有的父提交(比如 git log) ...
- python神操作将list拉平
python 神操作 将list 拉平 list_of_lists = [[1], [2, 3], [4, 5, 6]]sum(list_of_lists, [])
- 转:Windows系统环境下安装dlib
原文链接 因为今天安装Face Recognition,需要先按照 dlib .需要在windows环境下做一些图片处理,所以需要在pycharm中配置环境,而其中需要的主要是dlib的安装: 下面说 ...
- 0 != null 为什么报指针?
大家好,这是我第一次写博客,来分享我平时工作中遇到的问题及平时学习的技术,如果有写的不好或者不对的地方还望大家能够指出和包涵. 那么接下来就开始说下我工作中遇到的这个问题,我写了一个test,如下: ...