Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用关闭方法停止子流程中的服务器_Python_Server_Multiprocessing_Shutdown - Fatal编程技术网

Python 使用关闭方法停止子流程中的服务器

Python 使用关闭方法停止子流程中的服务器,python,server,multiprocessing,shutdown,Python,Server,Multiprocessing,Shutdown,我正在Windows 10上的CPython 3.7中实现一个Server类,该类使用一个Server.service方法永久启动服务,并使用一个Server.shutdown方法停止服务。我需要在子流程中运行多个服务器实例 在子线程中运行服务器实例会按预期停止该实例: import threading import time class Server: def __init__(self): self.shutdown_request = False d

我正在Windows 10上的CPython 3.7中实现一个
Server
类,该类使用一个
Server.service
方法永久启动服务,并使用一个
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\u request
属性在父进程和子进程之间不共享,因此
server.shutdown()
调用不会影响子进程中正在运行的服务器实例

我知道我可以通过
多处理来解决这个问题。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()

但是我想保留
服务器.shutdown
方法,而不是根据使用情况更改
服务器
接口(单处理与多处理),我不希望客户端处理
多处理。事件

我终于想出了一个解决方案:

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()
它可以在两种情况下工作:单处理(多线程)和多处理

备注。-使用
方法中的
多处理.Event()
服务器
实例不再可拾取。如果要调用进程池中的
服务器
实例(使用
多处理.pool.pool
并发.futures.ProcessPoolExecutor
),可能会出现问题。在这种情况下,应该在
\uuu init\uu
方法中将
多处理.Event()
替换为
多处理.Manager().Event()