我需要一个长时间运行的Websocket客户端,从Websocket服务器接收推送消息,并且需要监视客户端的连接状态:如果连接断开,我需要知道。
我的方法是定期记录一个常量字符串,并在未检测到日志消息时触发警报。
我的想法:1)拥有一个Websocket客户端,响应不规则的传入消息。并且2)同时有一个循环,当websocket客户端抛出ConnectionClosed异常时停止记录消息。
我对新的3.5 async语法感到困惑。此WebSocket 实现专门基于asyncio。文档中的客户端 看起来正是我所需的。
但是,我不知道如何添加第二个协程来执行我的日志声明并在websocket连接抛出ConnectionClosed时停止。
下面是一些开启对话的内容,但由于alive方法阻塞了事件循环,所以无法使用。我正在寻找一个优雅的解决方案,可以同时运行两种方法。
我的方法是定期记录一个常量字符串,并在未检测到日志消息时触发警报。
我的想法:1)拥有一个Websocket客户端,响应不规则的传入消息。并且2)同时有一个循环,当websocket客户端抛出ConnectionClosed异常时停止记录消息。
我对新的3.5 async语法感到困惑。此WebSocket 实现专门基于asyncio。文档中的客户端 看起来正是我所需的。
但是,我不知道如何添加第二个协程来执行我的日志声明并在websocket连接抛出ConnectionClosed时停止。
下面是一些开启对话的内容,但由于alive方法阻塞了事件循环,所以无法使用。我正在寻找一个优雅的解决方案,可以同时运行两种方法。
#!/usr/bin/env python
import asyncio
import logging
import websockets
logger = logging.getLogger(__name__)
is_alive = True
async def alive():
while is_alive:
logger.info('alive')
await asyncio.sleep(300)
async def async_processing():
async with websockets.connect('ws://localhost:8765') as websocket:
while True:
try:
message = await websocket.recv()
print(message)
except websockets.exceptions.ConnectionClosed:
print('ConnectionClosed')
is_alive = False
break
asyncio.get_event_loop().run_until_complete(alive())
asyncio.get_event_loop().run_until_complete(async_processing())
asyncio.wait
,无需在示例中使用asyncio.ensure_future
。 - Vincent