首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用无服务器函数(例如AWS Lambda)的"Fork and Join“/ Python

使用无服务器函数(例如AWS Lambda)的"Fork and Join“/ Python
EN

Stack Overflow用户
提问于 2019-03-19 02:22:26
回答 1查看 330关注 0票数 2

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

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

这就是我被困住的地方:当所有页面都被处理完后,我需要将结果组合到一个输出图像中,但是如何知道所有页面--“可变批量调用”--何时完成呢?

我曾考虑过,例如,将进度信息写入s3或dynamo,并在每个页面之后调用组合函数,以便只进行该函数的最后一次调用(当进度检查完成时)。我见过像期货/承诺这样的选项,但一页芯片的处理时间大约是10-15分钟,所以我不想让“控制器”函数等待期货/承诺的完成,因为在这一点上,使用多个调用会更便宜。

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-03-19 02:42:34

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

我相信CloudWatch警报会以5分钟为间隔轮询队列状态,所以对于处理时间较长(大约10- 15分钟)的用例来说,这不会是瓶颈(Lambda超时是15分钟,所以如果您设置为15分钟轮询,那么您的Lambda要么失败了,要么到那时就会完成)。

一步一步,这将是什么样子的:

  1. Upload new file to S3
  2. Upload触发lambda将文件分解为新文件夹内的“芯片”
  3. 将所有芯片添加到新队列
  4. lambda将芯片从队列中拉出
  5. 当队列为空时,触发聚合lambda

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55227785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档