AWS Lambda 中的多处理

问题描述 投票:0回答:1

我尝试使用 Dynamodb 流和 ProcessPoolExecutor 同时触发 lambda。这是我收到的错误。

场景是当一堆记录(例如 1000 条记录)落入 dynamodb(批量大小 10)时,流会触发 lambda。我之前使用过 ThreadPoolExecutor,它可以工作,但是在一个批次的 10 个进程中,只有 5-8 条记录被处理,剩下的就剩下了。每条记录大约需要 50 秒才能完成。 AWS lambda 的 5 分钟限制是否跳过了 ThreadPoolExecutor 中的其他记录。另外,使用 ProcessPoolExecutor 将帮助我解决 ThreadPoolExecutor 的问题???

    [Errno 38] Function not implemented: OSError
    Traceback (most recent call last):
    File "/var/task/ycf_calculator.py", line 464, in main
    with ProcessPoolExecutor(max_workers=25) as executor:
    File "/var/lang/lib/python3.6/concurrent/futures/process.py", line 390, in __init__
    EXTRA_QUEUED_CALLS)
    File "/var/lang/lib/python3.6/multiprocessing/context.py", line 102, in Queue
    return Queue(maxsize, ctx=self.get_context())
    File "/var/lang/lib/python3.6/multiprocessing/queues.py", line 42,in __init__
    self._rlock = ctx.Lock()
    File "/var/lang/lib/python3.6/multiprocessing/context.py", line 67, in Lock
    return Lock(ctx=self.get_context())
    File "/var/lang/lib/python3.6/multiprocessing/synchronize.py", line 163, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
    File "/var/lang/lib/python3.6/multiprocessing/synchronize.py", line 60, in __init__
    unlink_now)
    OSError: [Errno 38] Function not implemented
python-3.x amazon-web-services aws-lambda
1个回答
4
投票

您正在使用一次调用来处理一批 10 条记录。每条记录的处理时间约为 50 秒。没有并行处理,50 * 10 = 500 秒。

问题是,你没有按照 Lambda 的方式来做。

我的建议是将现有的 Lambda 拆分为两个不同的 Lambda(一个批处理器和一个工作者)。

批处理器 Lambda 由您的 DynamoDB 流触发(如示例所示,批处理大小为 10)。然后,此 Lambda 异步为流中 10 条记录中的每一个调用 worker Lambda 。 (重要提示:每次 worker 调用仅传递 one 记录。)

worker Lambda 独立接收和处理且仅有一个记录。这就是它的全部作用。

简而言之,

1 dynamoDB stream -> 1 batch invocation -> 10 worker invocations

大大简化了。无需搞乱多线程或多处理。

您还可以免费获得 10 个 CPU 核心!

© www.soinside.com 2019 - 2024. All rights reserved.