多进程开发如何共享数据:以python为例

本文探讨了使用Gunicorn部署项目时遇到的多进程通信问题,特别是在功能需要保持单例执行的情况下。介绍了几种进程间共享数据的方法,如使用multiprocessing.managers、外部资源如数据库和文件,以及控制代码执行的独特策略。
Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

最近使用gunicorn部署了一个项目,在启动的时候,加上了worker 3的参数。也就是说,同时有3个进程存在。
这就引出了进程间通信的问题。因为有一个功能只用单线程去执行就行了,也就是说,即使启动100个进程,
这部分功能只有一个执行的实例才可以。否则系统就紊乱了。

如何在多进程之间共享数据呢?
根据我搜索到的资料,有以下几种方案:

使用 multiprocessing.managers

介绍:http://www.cnblogs.com/Xjng/p/4902514.html

外部资源共享对象,例如数据库,文件等

这个很好理解,即使进程再多,连接的都是同一个数据的同一张表,更新的都是一个变量的值。
不管任何进程更新了值,后面再执行的进程取到的值肯定就是最新的 了。

使用 thread worker 来跑

其他控制方法

因为原来的代码也没有考虑到多进程处理,并且使用threading库,创建了一个线程a去完成一部分功能。后来需要同时存在多个app的进程,使用了gunicorn的works 参数,使得每个app进程都创建了一个线程a。其实正确的做法,应该在设计之初使用python多进程编程,使得进程间能够通信。
但现在代码已经无法承受这样的改动了,只能想办法找到一个让代码只执行一次的控制条件。
比如当前代码的副作用就是生成了一个文件。我就在每次执行之前判断当前是否存在产生时间为这个时间点的文件存在,
如果存在,直接跳过本次循环就好了。

心得

在一开始的设计中就要考虑好是用多线程,多进程,还是单线程,单进程。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值