繁体   English   中英

如何阻止多个进程创建另一个进程的多个实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM