python - "Fork and Join"具有无服务器函数(例如 AWS Lambda)/Python

标签 python amazon-web-services aws-lambda

我正在使用 AWS Lambda ( https://registry.opendata.aws/sentinel-2/ ) 处理相对较大的图像。

为了处理这些图像,我将它们分割成更小的图像(约 1500 个“芯片”),这些图像可以独立处理(芯片的数量根据源图像的内容而变化)。使用 Lambda 的多次调用并行处理芯片,该 Lambda 接受数百个芯片的“页面”。

这就是我陷入困境的地方:处理完所有页面后,我需要将结果合并到单个输出图像中,但如何知道所有页面(“可变批处理调用”)何时完成?

我考虑过例如将进度信息写入 s3 或 dynamo,并在每个页面之后调用组合函数,以便只有该函数的最后一次调用才会继续(当进度检查返回完成时)。我见过像 futures/promise 这样的选项,但是一页芯片的处理时间约为 10-15 分钟,所以我不想保留一个“ Controller ”功能来等待 futures/promise 完成,因为此时多次调用会更便宜。

有没有更好的解决方案,写出进度信息并多次检查?

(注意我见过这个问题:Fork and Join with Amazon Lambda)

最佳答案

您可以使用 Amazon SQS 将芯片添加到队列中,并让工作人员或 Lambda 将这些单独的作业从队列中拉出。然后,您可以设置一个 cloudwatch 警报来监视队列的深度,其中队列深度为零(作业已完成)会触发“完成”Lambda,它将各个输出芯片重新组合在一起。

我相信 CloudWatch 会以 5 分钟的间隔发出轮询队列状态警报,因此对于处理时间较长(约 10-15 分钟)的用例,它不会成为此处的瓶颈(Lambda 超时无论如何都是 15 分钟) ,因此,如果您设置在 15 分钟进行轮询,那么您的 Lambda 要么已失败,要么将在那时完成)。

一步一步来,这会是什么样子:

  1. 将新文件上传到 S3
  2. 上传会触发 lambda 将文件分解为新文件夹中的“碎片”
  3. 将所有筹码添加到新队列
  4. Lambda 将筹码从队列中拉出
  5. 当队列为空时,触发聚合lambda

这是关于根据队列状态设置触发器的另一个有用答案:Efficient way to check whether SQS queue is empty

关于python - "Fork and Join"具有无服务器函数(例如 AWS Lambda)/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55227785/

相关文章:

amazon-web-services - 如何检测 Post Confirmation Lambda Trigger 中的密码更改?

node.js - 如何通过AWS lambda nodejs函数索引存储在S3中的XML文件?

python - 通过 matplotlib 在 TeX 中使用希腊符号的符号字体

python - 如何优化Python代码: Euler projec prob 4

python - pymongo - 如何通过 GridFS 中的索引创建/查询

amazon-web-services - 无法使用 CloudFormation 创建 PostgreSQL,但可以使用 Web 界面

ruby - 追溯未知 Sidekiq 进程的来源

python - OpenCV 中的 Lucas-Kanade 光流对我不起作用

amazon-web-services - Elastic Beanstalk重用现有负载均衡器

amazon-web-services - CodePipeline、CodeBuild、CloudFormation、Lambda : build multiple lambdas in a single build and assign their code correctly