Python 如何停止使用websocket.service()创建的websocket服务器?

Python 如何停止使用websocket.service()创建的websocket服务器?,python,websocket,python-asyncio,Python,Websocket,Python Asyncio,我已经用这个软件包创建了websocket serwer。我必须在运行时停止并重新启动此服务器 我的服务器作为asyncio.Task运行,但cancel()方法似乎什么都不做。 有没有办法停止此服务器任务,然后再启动它 server.py #!/usr/bin/env python3 import asyncio import websockets class App: def __init__(self): self._task = None s

我已经用这个软件包创建了websocket serwer。我必须在运行时停止并重新启动此服务器

我的服务器作为asyncio.Task运行,但cancel()方法似乎什么都不做。 有没有办法停止此服务器任务,然后再启动它

server.py

#!/usr/bin/env python3

import asyncio
import websockets


class App:
    def __init__(self):
        self._task = None
        self._slots = []

    async def worker(self, websocket, path):
        data = await websocket.recv()
        self._slots.append(data)
        await websocket.send(f'prev: {"; ".join(self._slots)}')

        self.stop_server()

    def start_server(self):
        self._task = asyncio.ensure_future(websockets.serve(self.worker, 'localhost', 5000))

    def stop_server(self):
        self._task.cancel() # this doeas not stop server :P
        print(self._task.cancelled()) # always False

    def run(self):
        try:
            loop = asyncio.get_event_loop()
            self.start_server()
            loop.run_forever()
        finally:
            loop.close()

App().run()
测试客户端

#!/usr/bin/env python

# WS client example

import asyncio
import websockets

async def hello():
    async with websockets.connect(
            'ws://localhost:5000') as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

asyncio.get_event_loop().run_until_complete(hello())
#/usr/bin/env python
#WS客户端示例
导入异步
导入WebSocket
异步def hello():
与websockets.connect异步(
“ws://localhost:5000”)作为websocket:
name=输入(“你叫什么名字?”)
等待websocket.send(名称)
打印(f“>{name}”)
问候语=等待websocket.recv()
打印(f“<{问候语}”)
asyncio.get_event_loop()。运行_直到完成(hello())

在您提供的链接的部署部分下,有一个优雅的关机部分:

关闭时,您可能希望优雅地关闭连接 服务器,可能在执行一些清理逻辑之后。有两种方法 要使用serve()返回的对象实现此目的,请执行以下操作:

  • 将其用作异步上下文管理器,或
  • 调用其close()方法,然后等待其wait_closed()方法完成
在Unix系统上,关机通常通过发送信号触发

下面是一个完整的示例(仅限Unix):

请注意,以上只是一个Unix示例

我在Windows上也得到了同样的结果,用以下内容替换了
停止
等待:

import threading
stop_event = threading.Event()
stop = asyncio.get_event_loop().run_in_executor(None, stop_event.wait)
然后,当您想停止服务器时,只需调用
stop\u event.set()

import threading
stop_event = threading.Event()
stop = asyncio.get_event_loop().run_in_executor(None, stop_event.wait)