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中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
随机推荐
- Cipolla算法学习笔记
学习了一下1个$\log$的二次剩余.然后来水一篇博客. 当$p$为奇素数的时候,并且$(n, p) \equiv 1 \pmod{p}$,用Cipolla算法求出$x^2 \equiv n \pmo ...
- 关于ENVI5.0菜单栏不能正常显示(win7 x86系统)
在安装了envi5.0之后,打开显示的并不是之前4.8版本的样式也就罢了,还不能正常的将菜单栏显示出来. 上网搜了下,发现又是一个是版本兼容的问题 解决: 找到Envi5.0 右键---属性---兼容 ...
- 如何让position fixed不再基于浏览器窗口定位
position:fixed默认是相对浏览器定位的. 就是将某个元素固定在浏览器的某个确定的位置,不随滚动条的移动而变化: MDN对position: fixed有一个注释: 当元素祖先的 trans ...
- idea创建maven多模块Spring Boot项目
1, 创建父项目 1.1,file - new - project 1.2,选择maven,Create from archetype(有的说不选,有的没说,不过我建父项目的时候没有勾选) 1.3,根 ...
- hbase 查看元数据
package com.jason.lala.pipe.dbinfo import com.jason.lala.common.query.option.HbaseOptions import org ...
- Fiddler抓包工具怎么设置HTTPS抓包
最近在学习使用 Fiddler 抓包工具时遇到一个问题,Fiddler 默认只对 HTTP 协议进行抓包,如果出现下图提示,则需要进行相应设置才可以抓包HTTPS 具体步骤 ①:Tools-Optio ...
- python 属性描述符
import numbers class IntField: # 一个类只要实现了这个魔法函数,那么它就是属性描述符 #数据描述符 def __get__(self, instance, owner) ...
- java中需要转义的特殊字符
在Java中,不管是String.split(),还是正则表达式,有一些特殊字符需要转义, 这些字符是 ( [ { / ^ - $ ¦ } ] ...
- 汇编语言01 - 打印 "Hello World!"
Hello World! 源代码 data segment msg db "Hello World!$";定义名称为msg的字符串,最后加上$,表示字符串结束 data ends ...
- Spring Boot 整合 Shiro ,两种方式全总结!
在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ...