最近使用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多进程编程,使得进程间能够通信。
但现在代码已经无法承受这样的改动了,只能想办法找到一个让代码只执行一次的控制条件。
比如当前代码的副作用就是生成了一个文件。我就在每次执行之前判断当前是否存在产生时间为这个时间点的文件存在,
如果存在,直接跳过本次循环就好了。
心得
在一开始的设计中就要考虑好是用多线程,多进程,还是单线程,单进程。
本文探讨了使用Gunicorn部署项目时遇到的多进程通信问题,特别是在功能需要保持单例执行的情况下。介绍了几种进程间共享数据的方法,如使用multiprocessing.managers、外部资源如数据库和文件,以及控制代码执行的独特策略。
3464

被折叠的 条评论
为什么被折叠?



