当前位置: 首页 > news >正文

python 进程间通信效率_python之并发编程-进程之间的通信

互斥锁

进程之间数据不共享,但共享同一套文件系统,或同一个打印终端是没有问题的。但共享导致了竞争,若不加以控制就会造成错乱。如下:

from multiprocessing import Process

import time

import random

def task1():

print('task1开始打印')

time.sleep(random.randint(1,3))

print('task1打印完成')

def task2():

print('task2开始打印')

time.sleep(random.randint(1,3))

print('task2打印完成')

def task3():

print('task3开始打印')

time.sleep(random.randint(1,3))

print('task3打印完成')

if __name__ == '__main__':

p1 = Process(target=task1,)

p2 = Process(target=task2,)

p3 = Process(target=task3,)

p1.start()

p2.start()

p3.start()

# task1开始打印

# task2开始打印

# task3开始打印

# task1打印完成

# task3打印完成

# task2打印完成

使用加锁可以使并发变成串行,牺牲效率,避免竞争

from multiprocessing import Process

from multiprocessing import Lock

import time

import random

def task1(lock):

lock.acquire()

print('task1开始打印')

time.sleep(random.randint(1,3))

print('task1打印完成')

lock.release()

def task2(lock):

lock.acquire()

print('task2开始打印')

time.sleep(random.randint(1,3))

print('task2打印完成')

lock.release()

def task3(lock):

lock.acquire()

print('task3开始打印')

time.sleep(random.randint(1,3))

print('task3打印完成')

lock.release()

if __name__ == '__main__':

lock = Lock()

p1 = Process(target=task1,args=(lock,))

p2 = Process(target=task2,args=(lock,))

p3 = Process(target=task3,args=(lock,))

p1.start()

p2.start()

p3.start()

# task1开始打印

# task1打印完成

# task2开始打印

# task2打印完成

# task3开始打印

# task3打印完成

利用多进程抢票:

from multiprocessing import Process

from multiprocessing import Lock

import time

import random

import json

def search():

time.sleep(random.random())# 模拟读取数据网络延迟

with open('db.json',encoding='utf-8') as f:

dic = json.load(f)

print(f'剩余票数{dic["count"]}')

def get():

with open('db.json',encoding='utf-8') as f:

dic = json.load(f)

time.sleep(random.random())# 模拟读取数据网络延迟

if dic['count'] > 0:

dic['count'] -= 1

time.sleep(random.random())# 模拟写数据网络延迟

with open('db.json',encoding='utf-8',mode='w') as f:

json.dump(dic,f)

print(f'{os.getpid()}用户购买成功')

else:

print('票没了')

def task(lock):

search()

lock.acquire()

get()

lock.release()

if __name__ == '__main__':

lock = Lock()

for i in range(5):

p = Process(target=task,args=(lock,))

p.start()

# 剩余票数1

# 剩余票数1

# 14004用户购买成功

# 剩余票数0

# 剩余票数0

# 票没了

# 剩余票数0

# 票没了

# 票没了

# 票没了

虽然可以用文件共享数据实现进程间通信,但问题是:

效率低(共享数据居于文件,而文件是硬盘上的数据)

需要自己加锁处理,容易形成死锁、递归锁(注意一个进程只能使用一个锁)

相关文章:

  • 戴尔:召回440万个笔记本电源适配器---看看你的是否在此之列?
  • python 决策树 字符型_[4] python: 决策树
  • 一点感悟
  • python删除过期文件_python删除过期文件的方法
  • swift 组件化_Swift + RxSwift MVVM 模块化项目实践
  • ACM晚上的模拟赛也狂FT
  • 数学建模算法python源码_热传导方程之显示差分算法(python源码)
  • python简单函数_Python基础知识点——简单 函数
  • python目录名称无效_python - NotADirectoryError:[WinError 267]通过Selenium Python调用Firefox时目录名称无效错误...
  • 一个IP建多个Web站点—主机头名法(转)
  • 密歇根大学的python课_GitHub - SouthernPark/pythoncourse: 密歇根大学python课程课后作业翻译...
  • 表达式必须是指向_Lambda表达式最佳实践
  • vim 编辑_每日学习:vim编辑器入门大全
  • 如何获得跟踪文件名称
  • autorelease什么时候释放_高温红色预警!温度越高甲醛释放量越大
  • #Java异常处理
  • 【个人向】《HTTP图解》阅后小结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Druid 在有赞的实践
  • exports和module.exports
  • Java基本数据类型之Number
  • nodejs调试方法
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • VuePress 静态网站生成
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • windows下如何用phpstorm同步测试服务器
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 工作手记之html2canvas使用概述
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端_面试
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我从编程教室毕业
  • 正则表达式
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #mysql 8.0 踩坑日记
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (arch)linux 转换文件编码格式
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (利用IDEA+Maven)定制属于自己的jar包
  • (五)关系数据库标准语言SQL
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net FrameWork简介,数组,枚举
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作