SQLAlchemyによるデータベース呼び出しがブロックされ、同期コード以外での使用には適していないという印象を受けました。私は正しいですか(私はそうではないことを願っています!)、またはそれを非ブロックにする方法がありますか?彼らは特にtornado.genいくつかのきちんとした非ブロックライブラリを持っているようSQLAlchemyを非ブロックに設定できますか?
答えて
あなたはgeventを使用して、非ブロッキングスタイルでSQLAを使用することができます。ここではpsycopg2のcoroutine supportを使用して、psycopg2を使用した例です:
https://bitbucket.org/zzzeek/green_sqla/
私はまた、人々がpymysqlと同じ考えを使用し聞きました。 pymysqlは純粋なPythonであり、ソケットライブラリを使用するため、geventはソケットライブラリを非同期にパッチします。
優秀!ありがとうございました。このように使用する際に注意すべき注意事項(ドキュメントには表示されません)がありますか? – Matty
不明。私はそれがプール機能を無効にするNullPoolを使ってうまくいくように思えました。そうでなければ何かがハングしていました。だから、おそらく慎重に進めてください。 – zzzeek
@zzzeekあなたのハングは、サルではないパッチを適用したスレッドを使ってSQLAlchemyのデフォルトプール(QueuePool)から来るかもしれません。 geventのサルパッチを適用するか、https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJの例で緑色のQueuePoolを作成してください。それは私がそれを持っていたときに同じ行動を固定した。 – CryingCyclops
はTornadoを見てください。
我々はMomoko、トルネードのための非ブロックpsycopgラッパーのlibと一緒にいることを使用しています。これまでのところ素晴らしいことでした。おそらく唯一の欠点は、SQLAlchemyがあなたに与えるすべてのモデルオブジェクトを失うことです。パフォーマンスは非現実的です。
私はトルネードを見てきました。私はうまくその道を行くかもしれません。おそらく、私はこれをテストするためのデモコードを書くべきですが、psycopgドライバが非同期データベース呼び出しをサポートしているとしたら、SQLAlchemyで非ブロッキングDB呼び出しを行うことは可能でしょう。 – Matty
@Matty良いアイデア、私はあなたがそれにどうやって行くのか聞きたいと思うだろう。 SQLAlchemyでヒットすると主張している主要な問題の1つは、ブロッキングコールがいつ行われるかを正確に把握していないことです。もちろん、あなたはいつもコードに深く潜んで、私の腸がそれが多くの仕事になると言うときを理解することができます。 – kuhnza
@Kahunza psycopg2のためのドキュメントを簡単に見た後、SQLAlchemyのの 'create_engine()'関数に渡されます接続文字列に含めることが可能な引数があります表示されます。たぶん、メンテナーの一人がチャイムするか、私は彼らのリストを尋ねます。乾杯! – Matty
greenletの助けがなければ、答えはasyncioの文脈では、ないです。
は、しかし、asyncioでSQLAlchemyの部分のみを使用することが可能です。 GINO projectの例では、エンジンと完全実行コンテキストなしでSQLAlchemyコアのみを使用して、asyncioで簡単なORMを作成しています。
- 1. ブロック属性を非ブロック要素に設定する
- 2. Postgres/SQLAlchemyにapplication_nameを設定
- 3. attributeError:フラスコで属性を設定できません - SQLAlchemy
- 4. ラベルIDはEvalブロックで設定できますか?
- 5. tfileopendialogのスタートアップフォルダをシェル(非ファイルシステム)フォルダに設定できますか?
- 6. 変数をブロックの内側からブロックの外側に設定しますか?
- 7. ウィンドウ用のsqlalchemyの設定
- 8. 設定コード:: Linux/Ubuntuでのブロックのブロック
- 9. Django Admin - admin.pyで設定できる新しいブロックを追加しますか?
- 10. ブロックをUIButtonのターゲットとして設定することはできますか?
- 11. SQLAlchemyのインデックス制限を設定する
- 12. cssが表示を設定できません:ブロック
- 13. Delphiのモーダルフォームは非ブロック化できますか?
- 14. OpenCVブロックでCinderプロジェクトを設定する
- 15. ドラッグ開始後、event.dataTransferを非同期に設定できますか?
- 16. SQLAlchemyでSQLite PRAGMA文を設定するには
- 17. SQLAlchemy session.flush()を定期的に設定する方法
- 18. SQLALCHEMY既定のFalseをnullに設定するTrue
- 19. Mercurial設定オプションをプログラム的に設定できますか?
- 20. __tablename__をSQLAlchemyのシャーディングに動的に設定していますか?
- 21. 非スプリングベースのWebアプリケーションでHazelcastを設定することはできますか?
- 22. ServiceStack OrmLiteは非公開セッターでプロパティを設定できますか?
- 23. SQLAlchemyでレールのような関連付けを設定できますか? Railsでは
- 24. rubyでブロックをインラインで定義できますか?
- 25. Azureブロックブロブから特定のブロックをダウンロードできますか?
- 26. MVCコアで非同期コードをブロックすることはできますか?
- 27. 設定ファイルでSoapHttpClientProtocol Timeoutプロパティを設定できますか?
- 28. log4net設定内でプロパティ値を設定できますか?
- 29. SQLAlchemyは結合のインデックスを設定します
- 30. SQLAlchemyはpostgres JSONカラムのデフォルト値を設定します
短い回答、いいえ。これは、SQLalchemy自体ではなく、ブロックしているデータベースライブラリです。しかし、別のスレッドでDBの処理を停止することはありません。 – AdamKG
@AdamKGこれはおそらく答えではなく、コメントでなければなりません! :-) – Matty