我正在Windows 10的CPython 3.7中实现一个Server
类,该类将永远开始提供服务,而Server.serve
方法将停止提供服务。我需要在子流程中运行多个服务器实例。
在子线程中运行服务器实例将按预期停止该实例:
Server.shutdown
但是,在子进程中运行服务器实例并不会意外停止实例:
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
调用不会影响子进程中正在运行的服务器实例。 / p>
我知道我可以用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()
方法,而不是根据其用法(单处理 v。多处理)更改Server.shutdown
接口,并且我不希望客户端处理Server
。
答案 0 :(得分:1)
我终于找到了解决方案:
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()
它在两种情况下均有效:单处理(多线程)和多处理。