プロジェクトを実行するマルチスレッド。Nワーカースレッドの数は、DBからのジョブを取得し、その結果をDBに書き戻されるがあります。
プロジェクトはいくつかの時間のために実行されている場合は、データベース接続が枯渇していることがわかったが、幸い良いメモリ、その後、8,000以上の接続の最後の数を高めることとなっています。接続数を枯渇すると、このエラーのようなPostgreSQLが発生します。
FATAL:残りの接続スロットは非スーパーユーザ接続のレプリケーションがために予約されている
、おそらく知識であるので、2つのポイント:
Webプロジェクト場合は1、とき要求、ジャンゴの終わり私は、接続を閉じるようになります。はい、何も接続プールがありません。
2.私たちは、非Webプロジェクトであるため、要求イベントの最後には存在しないので、彼らは接続を閉じなかったので。しかし実際には、これは詠唱によって閉鎖されていないため、問題が発生することはありませんが、問題がどこにあるかわからない、漏れ接続があるだろう、接続データが常に成長します。
最終溶液は、タスクの完了後、つまり、私たちのプロジェクトに固有の、データベース接続をクローズするためのイニシアチブをとるための時間を見つけるために、各ワーカースレッドで、それに関連する接続を置く我々はThreadPoolExecutorを使用しているので、Djangoは、これを行うことは容易であるので、オフポイント。
コードは次のとおりです。
django.dbインポート接続から
DEFのon_done(フューチャー):
connections.close_all()
DEFメイン():
キュータAS ThreadPoolExecutor()を持つ:
しばらく真:
フューチャーexecutor.submit =(DO、get_a_job())
future.add_done_callback(on_done)
関係するその他の技術情報:gzitcast