2016-07-13 8 views
0

通常、RDBMSドライバはブロックされていますが、Tornadoはブロックされていないサーバです。これは、SQLクエリが終了するまでIOLoopがブロックされるため、CRUD操作を実行する際に非同期的に非同期的に使用されます。Tornado RDBMS統合

(ACIDのために)RDBMSをデータベースとして使用するプロジェクトに取り組んでいますが、いくつかの機能的な機能(つまりプッシュ通知)を編成するためにWebソケットが必要です。通常のRESTとWebソケットは1つのアプリケーションで実装できます。

私は(:https://gist.github.com/methane/2185380こちら):このスニペットを見つけたウェブの閲覧

import time 

from tornado.concurrent import run_on_executor 
from concurrent.futures import ThreadPoolExecutor # `pip install futures` for python2 

MAX_WORKERS = 4 


class Handler(tornado.web.RequestHandler): 
    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS) 

    @run_on_executor 
    def background_task(self, i): 
     """ This will be executed in `executor` pool. """ 
     time.sleep(10) 
     return i 

    @tornado.gen.coroutine 
    def get(self, idx): 
     """ Request that asynchronously calls background task. """ 
     res = yield self.background_task(idx) 
     self.write(res) 

は何それは基本的にないのは、別のスレッドにCRUDタスクをプッシュします。 私の質問は、これは、非同期HTTPサーバーを使用している場合、RDBMSドライバーをブロックするというデフォルトのアプローチですか?これらのブロックボトルネックを最小限に抑える他の方法はありますか?非同期サーバーでブロッキングRDBMSドライバーを使用するのも合理的ですか?

答えて

1

TornadoでRDBMSを処理する方法は複数あります。

Tornadoで非同期処理を実行するためのさまざまなDBのライブラリがあります。 https://github.com/tornadoweb/tornado/wiki/Links

GEventを使用して、トルネードで非同期データベースアクセスを取得することもできます。

別のオプションは、次のようなトルネードとのpython3非同期IOライブラリを使用することです:あなたは別のオプションを指摘したように https://aiopg.readthedocs.io/en/stable/

他の場所でDBの負荷をオフロードすることです。 ZeroMQやRabbitMQ、複数のスレッド、複数のプロセス、別のボックスのAPIなどのメッセージキューを使用できます。

標準のブロッキングデータベースアクセスメカニズムを使用することもできますが、それでもトルネードでは機能しますが、戻ってくるまでブロックされるだけです。これは問題でも問題ではないかもしれません。

私は昨年PyOhioで桃子、Aiopg、およびGEventについての講演を行いました: http://pyvideo.org/video/3698/from-synchronous-to-asynchronous-postgres-with-to

+0

感謝を!私はすべてのPython非同期RDBMSドライバ/ ORMが信頼できるものではないことを読んだ。人々は「ORMを作成するのは難しいです、それを正しく行うことはさらに困難です」と言っています。また、非同期DBアクセスを使用する場合のconcurencyはどうでしょうか? – lime

+0

asyncio + Tornadoを使用する目的は何ですか?彼らは両方ともIOLoopsを持っています、なぜ単にデフォルトのTornadoを使用しないのですか?ウェブ以外のものであっても、Tornadoのループは同じマナーでうまく使用できます。 – lime

+0

1.信頼性に関する限り、まだ問題はありませんでしたが、それは問題がないとは限りません。同期のものよりも非同期のものを使用している人が少ないため、目が少なくても、より多くの問題が予想されます。 2. ORMが難しいことに同意します。私は、ActiveRecordの実装に基づいてORMが嫌いです。私はPostgresのみを使用しているので、私はオブジェクトと関係のマッピングのみを行う1つのファイルormを作成し、他のものは作成しませんでした。 3.非同期で並行処理が問題になることがあります。少なくとも非同期機能をオンにしたときはポストグルでは使用できず、自動txnを使用できません。 –