[英]Python in AWS Lambda: multiprocessing, terminate other processes when one finished
我从另一个问题中了解到 AWS Lambda 不支持multiprocessing.Pool
和multiprocessing.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.