2012-04-18 1 views
24

SQLAlchemyによるデータベース呼び出しがブロックされ、同期コード以外での使用には適していないという印象を受けました。私は正しいですか(私はそうではないことを願っています!)、またはそれを非ブロックにする方法がありますか?彼らは特にtornado.genいくつかのきちんとした非ブロックライブラリを持っているようSQLAlchemyを非ブロックに設定できますか?

+1

短い回答、いいえ。これは、SQLalchemy自体ではなく、ブロックしているデータベースライブラリです。しかし、別のスレッドでDBの処理を停止することはありません。 – AdamKG

+2

@AdamKGこれはおそらく答えではなく、コメントでなければなりません! :-) – Matty

答えて

24

あなたはgeventを使用して、非ブロッキングスタイルでSQLAを使用することができます。ここではpsycopg2のcoroutine supportを使用して、psycopg2を使用した例です:

https://bitbucket.org/zzzeek/green_sqla/

私はまた、人々がpymysqlと同じ考えを使用し聞きました。 pymysqlは純粋なPythonであり、ソケットライブラリを使用するため、geventはソケットライブラリを非同期にパッチします。

+0

優秀!ありがとうございました。このように使用する際に注意すべき注意事項(ドキュメントには表示されません)がありますか? – Matty

+1

不明。私はそれがプール機能を無効にするNullPoolを使ってうまくいくように思えました。そうでなければ何かがハングしていました。だから、おそらく慎重に進めてください。 – zzzeek

+3

@zzzeekあなたのハングは、サルではないパッチを適用したスレッドを使ってSQLAlchemyのデフォルトプール(QueuePool)から来るかもしれません。 geventのサルパッチを適用するか、https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJの例で緑色のQueuePoolを作成してください。それは私がそれを持っていたときに同じ行動を固定した。 – CryingCyclops

6

Tornadoを見てください。

我々はMomoko、トルネードのための非ブロックpsycopgラッパーのlibと一緒にいることを使用しています。これまでのところ素晴らしいことでした。おそらく唯一の欠点は、SQLAlchemyがあなたに与えるすべてのモデルオブジェクトを失うことです。パフォーマンスは非現実的です。

+0

私はトルネードを見てきました。私はうまくその道を行くかもしれません。おそらく、私はこれをテストするためのデモコードを書くべきですが、psycopgドライバが非同期データベース呼び出しをサポートしているとしたら、SQLAlchemyで非ブロッキングDB呼び出しを行うことは可能でしょう。 – Matty

+0

@Matty良いアイデア、私はあなたがそれにどうやって行くのか聞きたいと思うだろう。 SQLAlchemyでヒットすると主張している主要な問題の1つは、ブロッキングコールがいつ行われるかを正確に把握していないことです。もちろん、あなたはいつもコードに深く潜んで、私の腸がそれが多くの仕事になると言うときを理解することができます。 – kuhnza

+0

@Kahunza psycopg2のためのドキュメントを簡単に見た後、SQLAlchemyのの 'create_engine()'関数に渡されます接続文字列に含めることが可能な引数があります表示されます。たぶん、メンテナーの一人がチャイムするか、私は彼らのリストを尋ねます。乾杯! – Matty

1

greenletの助けがなければ、答えはasyncioの文脈では、ないです。

は、しかし、asyncioでSQLAlchemyの部分のみを使用することが可能です。 GINO projectの例では、エンジンと完全実行コンテキストなしでSQLAlchemyコアのみを使用して、asyncioで簡単なORMを作成しています。

関連する問題