gpt4 book ai didi

python - 使用 shutdown 方法停止子进程中的服务器

转载 作者:行者123 更新时间:2023-12-01 07:48:24 40 4
gpt4 key购买 nike

我正在 Windows 10 上的 CPython 3.7 中实现一个 Server 类,其中使用永久启动服务的 Server.serve 方法和 Server.shutdown code> 停止服务的方法。我需要在子进程中运行多个服务器实例。

在子线程中运行服务器实例会按预期停止实例:

import threading
import time


class Server:

def __init__(self):
self.shutdown_request = False

def serve(self):
print("serving")

while not self.shutdown_request:
print("hello")
time.sleep(1)

print("done")

def shutdown(self):
print("stopping")
self.shutdown_request = True


if __name__ == "__main__":
server = Server()
threading.Thread(target=server.serve).start()
time.sleep(5)
server.shutdown()

但是,在子进程中运行服务器实例不会意外地停止该实例:

import multiprocessing
import time


class Server:

def __init__(self):
self.shutdown_request = False

def serve(self):
print("serving")

while not self.shutdown_request:
print("hello")
time.sleep(1)

print("done")

def shutdown(self):
print("stopping")
self.shutdown_request = True


if __name__ == "__main__":
server = Server()
multiprocessing.Process(target=server.serve).start()
time.sleep(5)
server.shutdown()

我怀疑在多处理情况下,父进程和子进程之间不共享 self.shutdown_request 属性,因此 server.shutdown() 调用不影响子进程中正在运行的服务器实例。

我知道我可以用multiprocessing.Event解决这个问题:

import multiprocessing
import time


class Server:

def __init__(self, shutdown_event):
self.shutdown_event = shutdown_event

def serve(self):
print("serving")

while not self.shutdown_event.is_set():
print("hello")
time.sleep(1)

print("done")


if __name__ == "__main__":
shutdown_event = multiprocessing.Event()
server = Server(shutdown_event)
multiprocessing.Process(target=server.serve).start()
time.sleep(5)
shutdown_event.set()

但我想保留 Server.shutdown 方法,而不是根据其使用情况更改 Server 接口(interface)(单处理v. 多处理) )并且我不希望客户端处理 multiprocessing.Event

最佳答案

我终于自己想出了解决办法:

import multiprocessing
import time


class Server:

def __init__(self):
self.shutdown_event = multiprocessing.Event()

def serve(self):
print("serving")

while not self.shutdown_event.is_set():
print("hello")
time.sleep(1)

print("done")

def shutdown(self):
print("stopping")
self.shutdown_event.set()


if __name__ == "__main__":
server = Server()
multiprocessing.Process(target=server.serve).start()
time.sleep(5)
server.shutdown()

它适用于任何一种情况:单处理(多线程)和多处理。

备注。 — 带有 multiprocessing.Event()__init__方法,Server实例不再可供选择。如果有人想调用Server,这可能是一个问题。进程池中的实例(使用 multiprocessing.pool.Poolconcurrent.futures.ProcessPoolExecutor )。在这种情况下,应该替换 multiprocessing.Event()multiprocessing.Manager().Event()__init__方法。

关于python - 使用 shutdown 方法停止子进程中的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344102/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com