はじめに
Lambda高速化のためのmultiprocessingを使った並列処理です。パッと使いたいときの自分用テンプレです。
実装
LambdaのPython3.6です。
import json
import boto3
from multiprocessing import Process, Pipe
import time
def worker(conn, num):
# ここに処理を記述
# boto3を使う場合
# session = boto3.Session()
# s3 = session.client('s3')
print(num)
response = f'process: {num}'
time.sleep(1)
conn.send(response) # 処理結果
conn.close()
def lambda_handler(event, context):
results = []
processes = []
parent_connections = []
for i in range(10):
parent_conn, child_conn = Pipe()
parent_connections.append(parent_conn)
process = Process(target=worker,args=(child_conn,i))
processes.append(process)
for process in processes:
process.start()
for process in processes:
process.join()
for parent_connection in parent_connections:
results.append(parent_connection.recv())
body = json.dumps({'results': results})
return {
'statsCode': 200,
'body': body
}
並列処理でboto3をたたく場合はスレッド(プロセス)の中でboto3.Session()からclientやresourceを呼びます(参考)。