2 つのレベルのマルチプロセッシングを実装する Python スクリプトがあります。
from multiprocessing import Process, Queue, Lock
if __name__ == '__main__':
pl1s = []
for ip1 in range(10):
pl1 = Process(target=process_level1, args=(...))
pl1.start()
pl1s.append(pl1)
# do somehting for awhile, e.g. for 24 hours
# time to terminate
# ISSUE: this terminates process_level1 processes
# but not process_level2 ones
for pl1 in pl1s:
pl1.terminate()
def process_level1(...):
# subscriibe to external queue
#
with queue.open(name_of_external_queue, 'r') as subq:
qInternal = Queue()
pl2s = []
for ip2 in range(3):
pl2 = Process(target=process_level2, args=(qInternal))
pl2.start()
pl2s.append(pl2)
# grab messages from external queue and push them to
# process_level2 processes to process
#
while True:
message = subq.read()
qInternal.put(m)
def process_level2(qInternal):
while True:
message = qInternal.get()
# do something with date form message
したがって、メインではprocess_level1
、それぞれが独自のサブプロセスの束を起動するスレーブ サブプロセスの束を起動しprocess_level2
ます。Main
事前定義された時間 (たとえば 24 時間) 実行された後、すべてが終了することになっています。問題は、上記のコードがサブプロセスの第 1 層を終了するが、第 2 層を終了しないことです。
両方のレイヤーを同時に終了するにはどうすればよいですか?
(おそらく重要な)警告:1つのアプローチは、と通信する内部キューを設定し、main
各サブプロセスにprocess_level1
シグナルを送信して、process_level1
それぞれのサブプロセスを終了させることだと思います。問題はprocess_level1
、外部キューからメッセージを読み取る無限ループを実行することです。そのため、メインからの終了信号をどこでどのように確認するのかわかりません。