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

Python 使用多处理进程启动多台服务器。检查进程是否已终止,python,multiprocessing,Python,Multiprocessing,我正在使用multiprocessing.Process启动多个服务器。服务器地址都在字典中定义,我希望它们都同时运行。我想找到一种简单的方法来检测某个服务器进程何时因某种原因终止,并重新启动它们。到目前为止,我得到的一个例子是: from multiprocessing import Process server_dict = {"server1": "localhost, 9998", "service2": "localhost, 9999"} running_servers = {}

我正在使用
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])

这是可行的,但我想一定有更好的办法。我不想经常检查这个过程是否有效

我建议的唯一变化是:

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

  • 不要迭代运行_服务器。迭代
    tuple(运行_servers.keys())
    tuple
    仅适用于Python 3,其中
    keys()
    返回迭代器)

  • 另一种可能的选择是使用线程池,每个进程一个线程。等待单个进程终止并重新启动它通常不是问题。不幸的是,除了Windows的API调用,
    WaitForMultipleObjects()


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

    在循环中迭代其键(
    用于运行\u服务器中的键
    )来更改
    运行\u服务器的内容(
    启动\u服务器
    )。这可能是不好的,您的第二个循环也应该是服务器dict中的key的
    我认为这没什么大不了的,因为我只是在进程不再活动时更改运行服务器的
    内容。只要您不更改key,它就会工作。该建议旨在防止您无意中这样做。在字典中添加或删除条目时使用iterkeys()可能会引发运行时错误或无法迭代所有条目[请参阅(
    对于dict中的x
    相当于
    对于dict中的x。iterkeys()
    谢谢你让我知道。我不会在任何地方更改密钥,所以我认为这不会是一个问题。这不是我真正想问的。我想知道是否有更好的方法来做到这一点,比如不运行
    服务器
    字典或类似于
    选择.epoll
    。我考虑使用全局
    队列
    并将其作为参数传递给服务器,服务器关闭后可以在服务器上写入,但必须有一种更优雅的方法来完成此操作(特定于unix)方法是打开一个
    管道
    ,这样服务器就有了写端,而主管就有了读端。如果服务器死了,管道就可以通过
    选择
    读取。