我在下面的例子中尝试检查它是否是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
我做错了吗?
答案 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可以有多个块。