【发布时间】: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。