Python AIORedis和酒吧/酒吧是';阿斯尼克

Python AIORedis和酒吧/酒吧是';阿斯尼克,python,asynchronous,python-asyncio,Python,Asynchronous,Python Asyncio,我用来编写异步服务,它将在某个通道上侦听并以异步方式运行一些命令 基本上,我从中提取了一段代码来编写一个小型测试应用程序,并删除了不必要的部分: import asyncio import aioredis async def reader(ch): while (await ch.wait_message()): msg = await ch.get_json() print('Got Message:', msg) i = int(m

我用来编写异步服务,它将在某个通道上侦听并以异步方式运行一些命令

基本上,我从中提取了一段代码来编写一个小型测试应用程序,并删除了不必要的部分:

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\u for
字段的json blob,然后在订户应用程序中使用
sleep
语句模拟
读卡器
协同程序中的一些工作

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

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

我的猜测是,只要点击wait ch.get_json(..)(甚至可能是wait ch.wait_message())行,我就应该能够处理下一条消息

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

您应该使用
确保未来
在单独的协同程序中处理每条消息:

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

我发现这个问题有点难以理解。如果这是唯一的协同程序(代码示例中的情况就是如此),那么它将在while循环中重复和顺序运行。i、 它将等待消息,在设定的时间内休眠,然后重复。在这种情况下,并行性不会产生任何影响,因为它是一个单一的协程。如果您有多个协程,那么asyncio在遇到
wait
语句时会来回“反弹”控件。哦,是的。我不知道为什么我认为暂停读卡器将允许同时处理另一个客户的读卡器调用。谢谢