使用其关闭方法在子进程中停止服务器

时间:2019-05-28 14:08:23

标签: python server multiprocessing shutdown

我正在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

1 个答案:

答案 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()

它在两种情况下均有效:单处理(多线程)和多处理。