Python 3.x AWS Lambda中的多线程处理

Python 3.x AWS Lambda中的多线程处理,python-3.x,amazon-web-services,aws-lambda,Python 3.x,Amazon Web Services,Aws Lambda,我试图通过ProcessPoolExecutor使用Dynamodb流并发触发lambda。这是我收到的错误 场景是当一组记录(比如1000条记录)落入dynamodb(批量大小为10)时,流触发lambda。我以前使用过ThreadPoolExecutor,它工作正常,但批处理中的10个进程中,只处理了5-8条记录,剩下的就剩下了。每条记录大约需要50秒才能完成。是AWS lambda的5分钟限制跳过了ThreadPoolExecutor中的其他记录吗。另外,使用ProcessPoolExec

我试图通过ProcessPoolExecutor使用Dynamodb流并发触发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

您正在使用一个调用来处理一批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
它大大简化了。无需处理多线程或多处理


你可以免费获得10个CPU核心

如何解决lambda中的此类错误?AWS lambda缺少
/dev/shm
,这就是为什么您在使用
ProcessPoolExecutor
时会看到上述错误。请参阅:。AWS lambdas不支持进程间共享内存。限制已更改为15分钟,因此即使AWS没有为您的lambda分配超过1个CPU,ThreadPoolExecutor也应该可以工作。您将如何获取和处理10个工作调用的结果?这必须是平行的,否则我们最终会遇到完全相同的问题。