繁体   English   中英

AWS Lambda 中的 Python:多处理,完成后终止其他进程

[英]Python in AWS Lambda: multiprocessing, terminate other processes when one finished

我从另一个问题中了解到 AWS Lambda 不支持multiprocessing.Poolmultiprocessing.Queue

我还在 AWS Lambda 中研究 Python 多处理。 但我的问题是:当第一个子进程返回时,我们如何终止主进程? (所有子进程将以不同的执行时间返回)

我在这里有什么:

import time
from multiprocessing import Process, Pipe

class run_func():
    
    number = 0

    def __init__(self, number):
        self.number = number

    def subrun(self, input, conn):
         # subprocess function with different execution time based on input.
        response = subprocess(input)
        conn.send([input, response])
        conn.close()

    def run(self):
        number = self.number
        processes = []
        parent_connections = []
        for i in range(0, number):
            parent_conn, child_conn = Pipe()
            parent_connections.append(parent_conn)
            process = Process(target=self.subrun, args=(i, child_conn,))
            processes.append(process)

        for process in processes:
            process.start()
        for process in processes:
            process.join()

        results = []
        for parent_connection in parent_connections:
            resp = parent_connection.recv()
            print(resp)
            results.append((resp[0],resp[1]))
        return results

def lambda_handler(event, context):
    starttime = time.time()
    results = []
    work = run_func(int(event['number']))
    results = work.run()
    print("Results : {}".format(results))
    print('Time: {} seconds'.format(time.time() - starttime))
    return output

当前程序将返回,直到所有子进程完成( for parent_connection in parent_connections )。 但我想知道如何在第一个子进程完成时终止? (至少终止主进程,其他子进程 - 可以让它继续运行)

补充:要清楚,我的意思是第一个返回的子进程(可能不是第一个创建的子进程)。

所以 join() 循环是等待所有子进程完成的循环。

如果我们在完成第一个孩子后打破它并强行终止所有其他过程,它会对你有用

class run_func():
    
    number = 0

    def __init__(self, number):
        self.number = number

    def subrun(self, input, conn):
         # subprocess function with different execution time based on input.
        response = subprocess(input)
        conn.send([input, response])
        conn.close()

    def run(self):
        number = self.number
        processes = []
        parent_connections = []
        for i in range(0, number):
            parent_conn, child_conn = Pipe()
            parent_connections.append(parent_conn)
            process = Process(target=self.subrun, args=(i, child_conn,))
            processes.append(process)

        for process in processes:
            process.start()
        for process in processes:
            process.join()
            break
        results = []
        for parent_connection in parent_connections:
            resp = parent_connection.recv()
            print(resp)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM