1

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、外部キューからメッセージを読み取る無限ループを実行することです。そのため、メインからの終了信号をどこでどのように確認するのかわかりません。

4

0 に答える 0