我使用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])
这有效,但我必须有更好的方法来做到这一点。我不想经常检查过程是否存在。
答案 0 :(得分:0)
我建议的唯一变化是:
在while True
循环内但在for
循环之外插入对time.sleep
的调用。根据要重新启动已终止服务器的速度,选择延迟值。这将阻止您的程序广泛和不必要地使用CPU时间。在这种情况下,使用sleep
是一种非常常见的编码模式。
不要迭代running_servers
。迭代tuple(running_servers.keys())
(仅{3}} tuple
返回迭代器的Python 3需要keys()
。
另一种可能的选择是使用一个线程池,每个进程一个线程。等待单个进程终止并重新启动它通常不是问题。不幸的是,没有Windows的便携式替代品。 WaitForMultipleObjects()
API调用。
这些解决方案似乎是可移植的,至少可以用于* nix和Windows。但如果您不需要便携性,还有其他方法可以完成这项工作。 @Helmut的评论显示了* nix特定的解决方案。在Windows上,通常可以使用WaitForMultipleObjects
。