7

ajaxlongpollingとGeventを使用してチャットを実装しました。読み取るには、クライアントは更新ビューをajaxし、Gevent.event.waitで更新を待ちます。

問題:(セッション情報を取得するために)リクエストの開始時にDjangoによって開かれたPostgresqlトランザクションは、リクエストの終了まで閉じられません。そして、それらのアイドル状態のトランザクションは多くのメモリを消費します。

リクエストを閉じずにPostgresqlトランザクションを閉じる最もクリーンな方法は何でしょうか?現在、request_finishedシグナルを手動で送信していますが、ハックのように感じます。

4

2 に答える 2

2

とにかく、あなたがやっている方法は、おそらくあなたのハックの枠組みの中で最善の方法です. django-socketio のようなものを使用する代わりに、リクエスト/レスポンス プロセスにシューホーン ロング ポーリングを実行しようとしている理由はありますか?

于 2012-02-16T00:36:40.987 に答える
0

ここを参照してください: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

@transaction.commit_manually
def yourview(request):
    # do your db actions
    transaction.commit()

または、コンテキストマネージャーを好む場合:

def yourview(request):
    ...
    with transaction.commit_manually():
         # do your db actions
    ...

また、PostgreSQL 接続を開いたままにするメモリの問題がある場合は、pgbouncer または存在するさまざまな gevent 接続プールを使用したプーリング ソリューションを探す必要があります。これにより、パフォーマンスが大幅に向上するはずです。

于 2012-02-16T11:22:45.970 に答える