gpt4 book ai didi

python - AIORedis 和 PUB/SUB 不是 asnyc

转载 作者:行者123 更新时间:2023-11-28 21:49:04 26 4
gpt4 key购买 nike

我用了aioredis用于编写将在特定 channel 上监听并以异步方式运行某些命令的异步服务。

基本上我从examples page中获取了一个代码编写一个小的测试应用程序并删除不必要的部分:

import asyncio
import aioredis

async def reader(ch):
while (await ch.wait_message()):
msg = await ch.get_json()
print('Got Message:', msg)
i = int(msg['sleep_for'])
print('Sleep for {}'.format(i))
await asyncio.sleep(i)
print('End sleep')


async def main():
sub = await aioredis.create_redis(('localhost', 6379))
res = await sub.subscribe('chan:1')
ch1 = res[0]
tsk = await reader(ch1)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

还有另一个测试应用程序,它发布带有 sleep_for 字段的 json blob,然后在订阅者应用程序中使用它来模拟 reader 协程中的一些工作,使用sleep 语句。

我希望“ sleep ”以“并行”方式运行,但实际上它们以同步方式出现在屏幕上,只是一个接一个。

我的猜测是,只要点击 await ch.get_json(..)(或者甚至 await ch.wait_message())行,我就应该能够处理下一条消息。在实践中,它像同步代码一样运行。我哪里错了?这可以使用连接池来处理,但这意味着有些东西不是异步的,也不知道到底是什么。

最佳答案

My guess was that as soon as hit the await ch.get_json(..) (or maybe even await ch.wait_message()) line I should be able to handle next message.

这不是 async/await 语法的工作方式。每次您在协程中点击 await 时,该协程将“暂停”,将控制权交给被调用的协程。如果它正在休眠,它不会自动处理下一条消息。

您应该做的是使用 ensure_future 在单独的协程中处理每条消息:

import asyncio
import aioredis

async def handle_msg(msg):
print('Got Message:', msg)
i = int(msg['sleep_for'])
print('Sleep for {}'.format(i))
await asyncio.sleep(i)
print('End sleep')

async def reader(ch):
while (await ch.wait_message()):
msg = await ch.get_json()
asyncio.ensure_future(handle_msg(msg))

async def main():
sub = await aioredis.create_redis(('localhost', 6379))
res = await sub.subscribe('chan:1')
ch1 = res[0]
tsk = await reader(ch1)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

关于python - AIORedis 和 PUB/SUB 不是 asnyc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34118816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com