マルチスレッドDjangoプログラムがデータベース接続の問題を完全に解決します。


DjangoのORMは非常に使いやすいので、Webプロジェクトでなくても使えるので、Djangoを使った非Webプロジェクトの資料はたくさん見つけられます。ORMの他にコマンドラインや配置ファイルなどのコンポーネントもとても使いやすいです。
最近はこのように非Webプロジェクトを開発しました。N個のワークスレッドがDBからjobsを取得し、結果をDBに書き込みます。簡単に言えばこうです。
プロジェクトがしばらく実行した後に、データベースの接続がなくなったことを発見しました。幸いにメモリが大きいです。その後ずっとアップして、最後の接続数は全部で九千万余りになりました。接続数を使い切ると、PostgreSQLにこのようなエラーが発生します。
FATAL:remaning connection sleots ares rerrved for non-replication superuser connections
それから各種について文書、コードを見て、問題を探して、その中の困難さは表に表さないで、最後に大体こんなに多い知識点です。
  • Djangoのデータベース接続はスレッドのlocal()の例において行われる。
  • はいつでも、データベース接続が必要となりますと、Djangoは一つのスレッドを作成します。あるいは、このスレッドに既存のものを使用します。
  • Webプロジェクトであれば、Djangoは終了要求時に接続をオフにします。はい、プールはありません。
  • は非Webプロジェクトですので、要求終了イベントは存在しません。ずっと接続をオフにしています。しかし、本来はこれも問題にならないはずです。クローズしていないのでずっと使っています。どこが問題になっているのか分かりません。接続が漏れているので、データはずっと増えています。
  • 最後の解決策はチャンスを見つけて、積極的にデータベース接続をオフにします。具体的には、私達のプロジェクトについては、作業スレッドがタスクを完了するたびに、それに関連する接続をオフにします。
    重点コードは以下の通りです。
    
    from django.db import connections
    
    def on_done(future):
      #             connections,         close_all(),             。
      connections.close_all()
    
    def main():
      # ...
      with ThreadPoolExecutor() as executor:
        while True:
          future = executor.submit(do, get_a_job())
          future.add_done_callback(on_done)
    
    アクティブクローズ後、データベース接続数は作業スレッド数に近い位置に下がり、安定した状態を維持します。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。