Python 如何停止使用websocket.service()创建的websocket服务器?
我已经用这个软件包创建了websocket serwer。我必须在运行时停止并重新启动此服务器 我的服务器作为asyncio.Task运行,但cancel()方法似乎什么都不做。 有没有办法停止此服务器任务,然后再启动它 server.pyPython 如何停止使用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
#!/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()方法完成
停止
等待:
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)