首页 > 解决方案 > 如何在 AWS Lambda 中使用 multiprocessing.process() 来替换 .pool()?

问题描述

因此,在对这个问题做了一些功课之后,似乎 multiprocessing.pool() 在 AWS Lambda 中不起作用,但 multiprocessing.process() 应该起作用。问题是,当我尝试换出我知道与新的 .process() 代码一起使用的代码时,我得到一个列表而不是我正在寻找的值。这是我正在尝试做的事情:

(注意:注释的代码是有效的 .pool() 示例,而它下面的 .process() 是中断的)

def evaluate_plans_parallel(foo, baz, bar):
score = {}
input_tuple = []
for k, v in plans.items():
    input_tuple.append({'somevar1': k, 'somevar3': v, 'somevar': foo,'somevar2': baz})

# score_list = []

# pool = multiprocessing.Pool(get_parallel_count())
# pool = multiprocessing.Pool(3)
# score_list = pool.map(evaluate_single_plan, input_tuple)

processes = []

score_list = []
for tup in input_tuple:
    process = Process(target=evaluate_single_plan, args=(tup,))
    processes.append(process)


for process in processes:
    process.start()

for process in processes:
    process.join()

print(processes)

for x in processes:
    for k, v in x.items():
        score[k] = v

top_score = sorted(score.values())[0]
print('Top score: {}: '.format(round(top_score, 3)))
return score

我在做一些明显不正确的事情吗?

标签: pythonpython-3.xlambdamultiprocessing

解决方案


所以事实证明我需要使用 .pipe() 来同步结果:

processes = []
parent_connections = []

for tup in input_tuple:
    parent_conn, child_conn = Pipe()
    parent_connections.append(parent_conn)

    process = Process(target=evaluate_single_plan, args=(tup, child_conn,))
    processes.append(process)


for process in processes:
    process.start()

for process in processes:
    process.join()

for x in parent_connections:
    print(x.recv()])

在 evaluate_single_plan 函数中,我不需要返回一个值,而是只需要发送给传入的 child_conn 参数:

child_conn.send(result)
child_conn.close()

推荐阅读