17

psycopg のドキュメントには次のように記載されています。「Psycopg 接続はグリーン スレッド セーフではなく、異なるグリーン スレッドで同時に使用することはできません。スレッドごとに 1 つのカーソルを使用して一度に複数のコマンドを実行しようとすると、エラー (またはバージョンのデッドロック) が発生します。 2.4.2 より前。したがって、プログラマーは、コルーチン間の接続の共有を避けるか、ライブラリに適したロックを使用して共有接続を同期することをお勧めします (プーリングなど)。"

グリーン スレッド セーフなプールの実装が見つかりません。

4

3 に答える 3

16

greenlet に適したgevent-psycopg2モジュールを知っていると思いますpsycopg

接続プーリングソリューションを探して、2つのソリューションを試しました:

  • SQLALchemy- モンキー パッチを適用したスレッドとgevent-psycopg2. このQueuePoolクラスはthreadingロックのためにモジュールを内部的にgevent-psycopg2使用しますpsycopg2

  • 例にpsycopg2 接続プーリングの例geventがあります

私は両方のソリューションを試しましたが、本番負荷では試していません。そのため、それらの堅牢性についてはまだ言えません。

于 2012-09-29T07:44:12.717 に答える
4

電話gevent.monkey.patch_thread()すれば使えるはずですpsycopg2.pool.ThreadedConnectionPool

于 2012-09-29T10:18:19.163 に答える
0

Here's a good pool (not just example, but used in production): psycopg2_pool.py

于 2012-09-29T07:39:55.620 に答える