バックグラウンド:
私はPostgresデータベースでDjangoを使用するプロジェクトに取り組んでいます。私のWeb検索のいくつかがそれについて言及しているので、重要な場合に備えてmod_wsgiも使用しています。Webフォームの送信時に、Djangoビューはかなりの時間(ユーザーが待ちたいと思うよりも長い時間)かかるジョブを開始するため、バックグラウンドでシステムコールを介してジョブを開始します。現在実行中のジョブは、データベースの読み取りと書き込みができる必要があります。このジョブには非常に時間がかかるため、マルチプロセッシングを使用してその一部を並行して実行します。
問題:
最上位のスクリプトにはデータベース接続があり、子プロセスを生成すると、親の接続が子に利用可能であるように見えます。次に、クエリの前にSET TRANSACTION ISOLATIONLEVELを呼び出す方法について例外があります。調査によると、これは複数のプロセスで同じデータベース接続を使用しようとしたためです。私が見つけた1つのスレッドは、子プロセスの開始時にconnection.close()を呼び出すことを提案しました。これにより、Djangoは必要なときに新しい接続を自動的に作成するため、各子プロセスには一意の接続があります。つまり、共有されません。子プロセスでconnection.close()を呼び出すと、親プロセスが接続が失われたと文句を言うため、これは機能しませんでした。
その他の調査結果:
私が読んだいくつかのことは、あなたが実際にこれを行うことができないこと、そしてマルチプロセッシング、mod_wsgi、およびDjangoが一緒にうまく機能しないことを示しているようでした。それは私が推測することを信じるのは難しいようです。
長期的な解決策となる可能性のあるセロリの使用を提案する人もいましたが、承認プロセスが保留されているため、現時点ではセロリをインストールできません。
永続的なデータベース接続について、SOや他の場所でいくつかの参照が見つかりましたが、これは別の問題であると私は信じています。
また、psycopg2.poolとpgpoolへの参照、および用心棒に関する何かが見つかりました。確かに、私はそれらについて読んでいることのほとんどを理解していませんでしたが、それは確かに私が探していたものとして私に飛び出しませんでした。
現在の「回避策」:
今のところ、私は物事を連続して実行することに戻りました、そしてそれは動作しますが、私が望むより遅いです。
マルチプロセッシングを使用して並列実行する方法に関する提案はありますか?親と2人の子がすべてデータベースに独立して接続できるとしたら、問題はないようですが、その動作を取得できないようです。
ありがとう、そして長さをお詫びします!