AWS Lambda 中的多处理

pyh*_*hot 1 amazon-web-services python-3.x aws-lambda

我试图使用 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
Run Code Online (Sandbox Code Playgroud)

das*_*mug 5

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

Lambda 的最长执行时间为 300 秒。Lambda 实际上在一个处理器/核心上运行,因此不支持多个 CPU 之间的多重处理。(有关更多见解,请参阅此问题。)

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

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

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

工作人员Lambda独立接收并处理一条且仅有一条记录。这就是它的全部作用。

简而言之,

1 dynamoDB stream -> 1 batch invocation -> 10 worker invocations
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您将如何获取并处理 10 个工作线程调用的结果?这也必须是并行的,否则我们最终会遇到完全相同的问题。 (3认同)