マルチスレッド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プロジェクトですので、要求終了イベントは存在しません。ずっと接続をオフにしています。しかし、本来はこれも問題にならないはずです。クローズしていないのでずっと使っています。どこが問題になっているのか分かりません。接続が漏れているので、データはずっと増えています。 最後の解決策はチャンスを見つけて、積極的にデータベース接続をオフにします。具体的には、私達のプロジェクトについては、作業スレッドがタスクを完了するたびに、それに関連する接続をオフにします。
重点コードは以下の通りです。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
最近はこのように非Webプロジェクトを開発しました。N個のワークスレッドがDBからjobsを取得し、結果をDBに書き込みます。簡単に言えばこうです。
プロジェクトがしばらく実行した後に、データベースの接続がなくなったことを発見しました。幸いにメモリが大きいです。その後ずっとアップして、最後の接続数は全部で九千万余りになりました。接続数を使い切ると、PostgreSQLにこのようなエラーが発生します。
FATAL:remaning connection sleots ares rerrved for non-replication superuser connections
それから各種について文書、コードを見て、問題を探して、その中の困難さは表に表さないで、最後に大体こんなに多い知識点です。
重点コードは以下の通りです。
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)
アクティブクローズ後、データベース接続数は作業スレッド数に近い位置に下がり、安定した状態を維持します。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。