シナリオ:
新しいビルドのために非常に大規模なDBモデルの移行が行われており、現在のライブデータをWebアプリからローカルテストデータベースに移行する方法の定型化に取り組んでいます。
モデルの移行を同時に処理するスクリプトをPythonでセットアップしたいと思います。モデルインスタンスのメソッドがfrom_legacy
あります。to_legacy
これまでのところ、すべてのインスタンスをロードしてthreads
それぞれに作成します。各スレッドは、変換を実行して結果を保存するメソッドをthreading
使用して、コアモジュールからサブクラス化されています。run
プログラムのメインループにこれらのスレッドのインスタンスの大きなスタックを構築させ、それらを1つずつ処理し始め、その作業を実行すると同時に最大10個だけ実行し、次のスレッドをフィードします。他のユーザーが移行を終了すると処理されます。
私が理解できないのは、これを行うためにキューを正しく利用する方法ですか?各スレッドが移行の完全なタスクを表す場合、最初にすべてのインスタンスをロードしてから、10に設定されたQueue
を作成し、maxsize
現在実行中のキューのみを追跡する必要がありますか?おそらくこのようなものですか?
currently_running = Queue()
for model in models:
task = Migrate(models) #this is subclassed thread
currently_running.put(task)
task.start()
put
この場合、容量がいっぱいになっている間にブロックする呼び出しに依存していますか?このルートに行くとしたら、どうやって電話すればいいtask_done
ですか?
むしろ、キューには(開始されたタスクだけでなく)すべてのタスクが含まれ、join
完了までブロックするために使用する必要がありますか?スレッドのキューを呼び出すjoin
と、含まれているスレッドが開始されますか?
「最大でN個の実行中のスレッドがある」問題に取り組むための最良の方法は何ですか?また、キューはどのような役割を果たさなければなりませんか?