Python asyncio-motor不能异步工作

时间:2017-04-09 06:36:35

标签: python python-asyncio

我在下面的例子中尝试检查它是否是Asyn。但它似乎没有起作用。我使用下面的代码。

import asyncio
import time
from motor.motor_asyncio import AsyncIOMotorClient


async def get_all_from_coll(col):
    client = AsyncIOMotorClient("localhost", 27017)
    db = client.project_matrix
    cursor = db[col].find()
    time.sleep(5)
    for document in await cursor.to_list(length=100):
        print(document)


loop = asyncio.get_event_loop()
print('001')
loop.run_until_complete(get_all_from_coll('users'))
print('002')

我按以下顺序获得输出

>>>001
>>>{'_id': ObjectId('58d9b178d011b53743d44413'), 'username': 'test1', 'password': 'test', '__v': 0}
>>>{'_id': ObjectId('58d9b229d011b53743d44414'), 'username': 'test2', 'password': 'test', '__v': 0}
>>>002

我做错了吗?

2 个答案:

答案 0 :(得分:2)

for document in await cursor.to_list(length=100):
    # (wrong)

这将等待cursor.to_list()完成,然后才开始for循环。要异步运行for循环(一次一个文档),you should use an async for

async for document in cursor.limit(100):
    # (ok)

但是,由于您的print("002")loop.run_until_complete后执行了,我的输出订单没有任何问题。

答案 1 :(得分:0)

在上面的示例中,使用async for或使用await cursor.to_list()无关紧要。无论哪种情况,都会有至少一个街区。如果使用await游标,则只阻止一次,async for可以有多个块。