【问题标题】:Launching multiple servers with multiprocessing Process. Check whether a process has terminated使用多处理进程启动多个服务器。检查进程是否已终止
【发布时间】:2014-02-14 14:33:59
【问题描述】:

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

这可行,但我必须有更好的方法来做到这一点。我不想不断检查进程是否存在。

【问题讨论】:

  • 您正在一个循环中更改 running_servers 的内容(start_server 会这样做),该循环会遍历其键 (for key in running_servers)。这可能很糟糕,你的第二个循环也应该是for key in server_dict
  • 我认为这并不重要,因为我只会在进程不再存在时更改 running_servers 内容。
  • 只要不换键就可以了。该建议旨在防止您无意中这样做。 在字典中添加或删除条目时使用 iterkeys() 可能会引发 RuntimeError 或无法遍历所有条目 [参见docs.python.org/2/library/stdtypes.html#dict.iterkeys]for x in dict 相当于for x in dict.iterkeys()
  • 感谢您告诉我。我不会在任何地方更改密钥,所以我认为这不会成为问题。这并不是我真正要问的。我想知道是否有更好的方法来做到这一点,比如没有running_server 字典或类似于select.epoll 的东西。我考虑过使用全局 Queue 并将其作为参数传递给服务器,它可以在关闭后写入,但必须有更优雅的方法来做到这一点
  • 另一种(unix 特定的)方法是打开一个pipe,这样服务器就有写端,主管有读端。如果服务器死了,管道就可以读取select

标签: python multiprocessing


【解决方案1】:

我建议的唯一更改是:

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

  2. 不要迭代 running_servers。迭代tuple(running_servers.keys())tuple 仅适用于keys() 返回迭代器的 Python 3)。

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

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

【讨论】:

    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2015-11-10
    • 2017-05-09
    • 2018-11-05
    相关资源
    最近更新 更多