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

时间:2014-06-22 23:50:34

标签: python concurrency race-condition

我有2个进程:Start和Status。可以在同一时间执行多个Start进程,并且应该只有1个Status进程实例。

启动启动过程时,它将尝试启动状态。目前,我尝试通过获取状态进程来检查状态的服务器端口是否已绑定以确定是否存在另一个状态,如果是,它将正常关闭,则尝试阻止多个状态启动。

然而,这有一个竞争条件,它检查绑定端口的时间,可能有另一个状态已经完成该检查并且正在绑定该端口,因此将创建2个状态。

是否有针对此的流程级解决方案?我考虑过另一个进程来监控系统中的状态数量,但还有另一种方法吗?

编辑:这是在Python 2.6中完成的

Edit2:从shell开始执行Start和Status。

2 个答案:

答案 0 :(得分:1)

首先,您可以使用supervisord之类的内容来协调进程的运行。它实际上非常好。你基本上配置你的进程,可以运行的最大数量等,它将处理其余的。但是,您需要弄清楚所有的小配置项。如果您将其作为另一个进程中的线程运行,您可能还希望将该状态进程分解为自己的状态进程。你会有更好的成功。

如果您改变了处理方式,可能会减少这个问题。而不是检查然后执行,只需执行并处理错误。

try: 
    open_port_listener()
except socket.error as e:
    do_nothing()

或者可以对套接字错误的类型进行更细致的检查。我假设你正在使用socket并且正在获取一个socket.error(可能是地址已经在使用或什么?)。

如果你使用multiprocessing模块运行它(我知道你不是因为你澄清了,但我会留下这个,以防它对其他人有用),你可以使用锁定以确保在一个或另一个进程上进行状态进程检查。 multiprocessing模块支持此功能。阅读文档here

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)

答案 1 :(得分:0)

有可能是pythonic方式,但我自己会使用daemontools,systemd,runit等流程管理器来启动和监督状态流程,以确保只有一个。