2017-04-09 27 views
0

私はAsynかどうかをチェックするために以下の例を試しました。しかし、それは動作していないようです。私は以下のコードを使用しました。Python asyncio-motorが非同期で動作しない

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

'time.sleep'がブロックしています。代わりに 'asyncio.sleep'を使用してください。 – dirn

答えて

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

これはforループを開始する前に終了するcursor.to_list()を待ちます。非同期forループ(1-文書アット-時間)、you should use an async for実行するには:

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

をしかし、あなたのprint("002")loop.run_until_completeを実行しているので、私はあなたに問題が表示されません出力順序。

+0

JavaScriptのような言語でこれを行った場合、結果は >>> 001 >>> 002 >>> {'_ id':ObjectId( '58d9b178d011b53743d44413')、 'username': 'test1'、 'password '、' test '、' test '、' __v ':0} >>> {' id ':ObjectId(' 58d9b229d011b53743d44414 ')、'ユーザー名 ':' test2 '、'パスワード ':'テスト '、' __v ':0} 私はそれを取得しません。注文でない場合は非同期であればどうなるでしょうか? – CoderS

+0

@CoderS 'loop.run_until_complete'は、タスクが完了するのを待つことを意味します。メインの「スレッド」は' get_all_from_coll'「スレッド」でブロックされます。したがって、本質的にあなたのプログラムはシングルスレッドになります。 – kennytm

+0

したがって、get_all_from_collを非同期に実行する利点はありませんか? – CoderS

0

async forを使用するか、await cursor.to_list()を使用するかは関係ありません。どちらの場合も、少なくとも1つのブロックが存在します。 awaitカーソルが使用されている場合は、1回のみブロックし、async forは複数のブロックを持つことができます。

関連する問題