[英]How to stop multiple processes from creating multiple instances of another process?
我有2个过程:启动和状态。 可以同时执行多个启动进程,并且应该只有1个状态进程实例。
启动启动过程时,它将尝试启动状态。 目前,我尝试通过获取状态进程来检查状态服务器的端口是否已绑定,以确定是否存在另一个状态来停止多个状态,并确定是否将其正常关闭。
但是,这有一个竞争条件,即它检查绑定端口的时间,可能还有另一个状态已完成检查并且正在绑定该端口,因此将创建2个状态。
有针对此的过程级解决方案吗? 我考虑过使用另一个进程来监视系统中的状态数,但是还有其他方法吗?
编辑:这是在Python 2.6中完成的
Edit2:启动和状态都从外壳中删除。
首先,您可以使用supervisor之类的东西来协调流程的运行。 实际上是相当不错的。 您基本上配置了进程,可以运行的最大数量等,它将处理其余的事情。 不过,您需要找出所有小的配置项。 如果您让该状态进程在另一个进程中作为线程运行,您可能还希望将其分解为自己的状态进程。 这样,您将获得更好的成功。
如果您更改了处理方式,则可以将其减少为问题。 代替检查然后执行,只需执行并处理错误。
try:
open_port_listener()
except socket.error as e:
do_nothing()
或者,也许要对套接字错误的类型进行更详细的检查。 我假设您正在使用socket
,并收到一个socket.error(可能是地址已在使用中或什么?)。
如果您使用multiprocessing
模块运行此multiprocessing
(自从您澄清以来就不知道,但是我将其保留,以防万一它对其他人有用),可以使用锁来确保状态过程检查发生在一个或另一个进程上。 multiprocessing
模块支持此功能。 在此处阅读文档。
from multiprocessing import Process, Lock
def startStatusProcess(l):
l.acquire()
if not do_check():
Process(target=runStatusProcess, args=()).start()
l.release()
if __name__ == '__main__':
lock = Lock()
startStatusProcess(lock)
可能有Python方式,但我本人会使用进程监控器(如daemontools,systemd,runit等)启动和监督状态进程,以确保只有一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.