AIORedis和酒吧/酒吧不是asny

2024-06-16 05:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用aioredis编写异步服务,该服务将侦听某个通道并以异步方式运行一些命令。在

基本上,我从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,然后在订阅服务器应用程序中使用sleep语句模拟reader协同程序中的一些工作。在

我原以为“睡眠”会“并行”运行,但事实上它们在屏幕上以同步方式出现,只是一个接一个。在

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


Tags: 代码loopasynciojson应用程序forget方式
1条回答
网友
1楼 · 发布于 2024-06-16 05:29:00

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() 

相关问题 更多 >