使用多处理过程启动多个服务器。检查进程是否已终止

时间:2014-02-14 14:34:00

标签: python multiprocessing

我使用multiprocessing.Process启动多台服务器。服务器地址都在字典中定义,我希望它们全部同时运行。我想找到一种简单的方法来检测其中一个服务器进程何时终止,出于某种原因并重新启动它们。我到目前为止所得到的一个例子是:

from multiprocessing import Process

server_dict = {"server1": "localhost, 9998", "service2": "localhost, 9999"}
running_servers = {}

def start_server(server_addr):
    server = Server(server_dict[key], RequestHandlerClass)
    p = Process(target=server.serve_forever())
    p.start()
    running_servers[key]= p


for key in server_dict:
    start_server(server_dict[key])

while True :
    for key in running_servers:
        if not running_servers[key].is_alive():
           start_server(server_dict[key])

这有效,但我必须有更好的方法来做到这一点。我不想经常检查过程是否存在。

1 个答案:

答案 0 :(得分:0)

我建议的唯一变化是:

  1. while True循环内但在for循环之外插入对time.sleep的调用。根据要重新启动已终止服务器的速度,选择延迟值。这将阻止您的程序广泛和不必要地使用CPU时间。在这种情况下,使用sleep是一种非常常见的编码模式。

  2. 不要迭代running_servers。迭代tuple(running_servers.keys())(仅{3}} tuple返回迭代器的Python 3需要keys()

  3. 另一种可能的选择是使用一个线程池,每个进程一个线程。等待单个进程终止并重新启动它通常不是问题。不幸的是,没有Windows的便携式替代品。 WaitForMultipleObjects() API调用。

    这些解决方案似乎是可移植的,至少可以用于* nix和Windows。但如果您不需要便携性,还有其他方法可以完成这项工作。 @Helmut的评论显示了* nix特定的解决方案。在Windows上,通常可以使用WaitForMultipleObjects