【问题标题】:Python Asyncio help.... Am I doing this right?Python Asyncio 帮助....我这样做对吗?
【发布时间】:2020-05-14 09:06:08
【问题描述】:

程序监听 websocket。当收到某个消息时,我们需要等待 5 秒,然后运行一个 restapi 调用到另一个服务器。

它适用于我可以手动触发的单个 websocket 消息。但是,会有大量的 websocket 消息,我将每秒处理大约 50-100 条消息。不确定我是否要采用正确的方法。我希望 asyncio 也是适合这项工作的工具,或者如果我应该用线程做一些事情。

另外,ws_connect 函数中是否需要“result = await on_message(msg)”或“result = on_message(msg)”?我对 asyncio 完全陌生

提前谢谢....

async def do_long_process(id):
        # Need to wait 5 seconds before doing anything
        await asyncio.sleep(5)
        return requests.post('http://do.action.com/%s', id)



async def on_message(message):
    msg = json.loads(message)
    if msg['type'] == 'takeaction':
        response = await do_long_process(msg['id'])



async def ws_connect():
    uri = f'ws://server/ws'

    async with websockets.connect(uri) as ws:
        while True:
            msg = await ws.recv()
            result = await on_message(msg)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(ws_connect())

【问题讨论】:

    标签: python asynchronous python-asyncio


    【解决方案1】:

    Asyncio 是完成这项工作的合适工具,您不需要线程,但您确实需要从请求切换到与 asyncio 兼容的 http 库,例如 aiohttp。

    ws_connect 函数中是否需要“result = await on_message(msg)”或“result = on_message(msg)”?

    由于on_messageasync def,您需要awaitasyncio.create_task()。如果您需要等待结果,请等待。否则,您调用asyncio.create_task(on_message(msg)) 并让它在后台运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-13
      • 2023-03-19
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2014-06-28
      相关资源
      最近更新 更多