嵌套多处理:如何正确终止?

2024-04-25 22:02:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

因此,在main中,我启动一组从属子进程process_level1,每个子进程启动一组自己的子进程process_level2Main应该运行一段预定义的时间(例如24小时),然后终止所有操作。问题是上面的代码终止了第一层的子进程,而不是第二层。在

如何同时终止两个层?在

(可能是一个重要的)警告:我想一种方法是建立一个内部队列,从main到{}通信,然后向每个{}子进程发送一个信号,以终止它们各自的子进程。问题是process_level1运行一个无限循环,从外部队列读取消息。所以我不确定我将在哪里和如何检查来自main的终止信号。在


Tags: toinforqueue进程mainprocessexternal