Как остановить сервер websocket, созданный с помощью websockets.serve ()? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть websocket serwer, созданный с помощью этого пакета https://websockets.readthedocs.io/en/stable/intro.html. Я должен прекратить перезапуск этого сервера во время выполнения.

Мой сервер работает как 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())
...