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