これは、 tornado使用されるmongodbの非同期ドライバーの主要な革新に関する記事のかなり無料の翻訳です。 この翻訳を書く主な動機は、 asyncio 、 async 、 awaitおよびPython 3.5サポートなど、このバージョンで登場した革新です。 この記事自体はイノベーションのリストではなく、 MongoDBでの非同期作業の簡潔な例です。
はじめに非同期集約するPython 3.5非同期および待機はじめに
最近、
Mongodb Motor用の
Pythonドライバーの新しい
Beta版が公開されました。 このバージョンには、最大のアップデートの1つが含まれています。 インストールには、次を使用できます。
python -m pip install --pre motor==0.5b0
Motor 0.5はまだ
PyMongo 2.8.0依存しています。 これは
PyMongo古いバージョンですが、今回のリリースは非常に大きいため、3番目のバージョンに完全に切り替えるのに十分な時間はありませんでした。
非同期
Motorは、
Tornado代替として
asyncioと統合できるように
asyncioました。 Remy Jolin、Andrei Svetlov
svetlov 、Nikolay
Novikに 、
asyncioでの作業のための
Motorの統合に多大な貢献をして
asyncioます。
Tornado asyncioと
asyncioは関連しています。
Tornado Motor例:
そして、これがasyncioの例です:
import asyncio from motor.motor_asyncio import AsyncIOMotorClient @asyncio.coroutine def f(): result = yield from client.db.collection.insert({'_id': 1}) print(result) client = AsyncIOMotorClient() asyncio.get_event_loop().run_until_complete(f())
Tornadoとは異なり、
asyncioは
http実装が含まれておらず、さらにフレームワークではありません。 これを行うには、Andrei Svetlovの
aiohttpライブラリを使用します。
Motorがaiohttpで動作する小さな
例 。
集約する
MotorCollection.aggregateはデフォルトでカーソルを返し、カーソルは
yieldなしで直接戻ります。 古い構文はサポートされなくなりました:
Motor 0.5ようにします。
asyncioはこれに
yield fromを使用します。
Python 3.5
Motorは現在、
Python 3.5と互換性があり、多少の労力が必要です。
Motorはコルーチンで動作するだけでなく、
MotorClient.openや
MotorGridFS.putなどの機能の一部を内部的に使用してコルーチンを使用するため、これは困難
でした 。
Python 2.6と
Python 3.4で動作するコルーチンを記述する方法がありましたが、
Python 3.5では最終的に壊れました。
Python 3.5ネイティブコルーチンまたは
Python 2コルーチンベースのジェネレーターに値を返す単一の方法はないため、値を返すすべての内部
motorコルーチンはコールバックを使用して書き換えられています。
非同期および待機
Python 3.5との統合に費やされた努力に対する報酬は、
asyncおよび
await構文で記述されたネイティブコルーチンで
motor動作するようになったことです。
async def f(): await collection.insert({'_id': 1})
MotorCollection.find 、
MotorCollection.aggregate 、または
MotorGridFS.findのカーソルは、
次の async forしてネイティブコルーチンに美しく、非常に効率的に統合できます。
async def f(): async for doc in collection.find(): print(doc)
どのくらい効果的ですか? 10,000ドキュメントのコレクションの場合、このコード例は0.14秒で実行されました。
gen.coroutineと
yieldを
asyncと
awaitに単純に
gen.coroutine次のコードは、同様のことを行います。
ただし、
async forでは0.04秒かかり、3倍高速です。
ただし、to_listのMotorCursorは依然として大きな役割を果たします。
to_listた関数は非同期の2倍の速度ですが、見た目はそれほど美しくなく、チャンクのサイズを指定する必要があります。
async forは非常にスタイリッシュ
async for見え、ほとんどの場合に使用できるほど高速に動作すると思います。
motorリリースのベータ版は常に公開されていませんでしたが、今回は別の方法で公開されました。
motorへの
asyncioの統合は、まったく新しいものです。 また、
motorコアの広範なリファクタリングと既存の
tornado統合の書き直しが必要だったため、すべての欠落を修正するためにベータ版がリリースされました。
PS PMに書き込むための文法エラーと翻訳エラーのリクエスト。