如何在AWS Lambda中使用multiprocessing.process()替换.pool()?

时间:2019-02-14 17:26:54

标签: python python-3.x lambda multiprocessing

因此,在完成了此问题的一些功课之后,似乎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

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

1 个答案:

答案 0 :(得分:1)

所以事实证明,我需要使用.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()])

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

child_conn.send(result)
child_conn.close()