4

私はPython Geventのストリームサーバーを使用して、同時TCP / IPリクエストを送信する別のマシン(リモート)と通信しています(平均60リクエスト/秒)。この通信の性質は、ほとんどが IO バウンド (短いテキストと音声ストリーム) です。Postgresql を使用して、各通信の結果を保存するつもりです (例: リモート サーバーから受信したファイル名)。

Streamserverで生成されたすべてのグリーンレットに対して新しいdb接続を呼び出すのは悪い考えだと思います(プールサイズ90なので最大90リクエスト/秒、それが私が期待する最大で平均60リクエスト/秒です)。キューに入れることができるdb接続プールと、ハンドラ関数の実行を開始するときにすべてのグリーンレットがプールからdb接続を取得することは可能ですか? 本番システムで機能するチュートリアルはありますか? どのように提案しますか?Ubuntu 10.04 64ビットでPython 2.7.3でgevent 0.13.8とpostgres 9.1を使用しています。

4

3 に答える 3

2

Gevent には、例に postgres データベース プールが含まれています。

https://github.com/gevent/gevent/blob/master/examples/psycopg2_pool.py

于 2012-11-02T18:41:50.850 に答える
2

アプリケーション内プーリングの代替手段は、 を使用してプールすることPgBouncerです。TCP 接続のオーバーヘッドと少しのセットアップはまだありますが、完全な新しい PostgreSQL セッションを作成する場合よりも大幅に少なくなります

アプリケーション内プーリングとは異なり、PgBouncer は PostgreSQL とプールの間の仲介として既存のシステムに透過的に導入できます。PostgreSQl をポート 5433 に移動し、PgBouncer をポート 5432 でリッスンするだけです。

于 2012-11-03T01:47:14.040 に答える
0

私は実際にここで同様の答えに答えました:
Python Postgres psycopg2 ThreadedConnectionPool が使い果たされました

基本的に、gevent を使用して非同期接続プールをセットアップし、postgres を介して Threadpool 接続を開始し、postgres に「グリーン」接続状態を追加しています。

したがって、基本的に、これは指定した接続の事前設定プール (100 など) を作成し、このプールを使用してクエリをキューに入れます。1 つのクエリが戻ってくると、新しいクエリが処理されます。私はこのアプローチが通常の postgres プールよりも好きです。これは、リクエストの非同期性と、Web フレームワーク内での実装が容易であるためです。

于 2018-03-23T18:35:44.030 に答える