【问题标题】:Image resizing AWS Lambda with threads使用线程调整 AWS Lambda 大小的图像
【发布时间】:2017-05-21 17:57:40
【问题描述】:

我在 S3 存储桶中有 20000 张图像。我想使用AWS Lambda 调整它们的大小。为此,我将图像下载到 Lambda 的 tmp 文件夹中,然后将其上传回 S3

我想优化它,所以我在其中实现了线程。当我使用 15 个线程时,我的代码工作正常,但是当我使用超过 15-16 个线程时,它会产生连接池已满等问题。我想提一下,我已经明确注意等待已经运行的线程终止。

我可以做些什么来优化代码?如果可以创建更多线程,那么在 Lambda 中创建线程的最佳方式是什么?

【问题讨论】:

  • 你实现了线程......在哪里?在外部调用 Lambda 函数的代码中,还是在 Lambda 函数本身中?如果是后者,我认为您实际上并没有在效率方面取得太大成就。如果是前者,什么连接池满了?无关的,请确保您在处理后从/tmp 删除您的文件,否则您将有另一个惊喜。
  • 我在 lambda 函数本身中实现了线程。是的,我已经清理了 /tmp 文件夹。是否有任何解决方法可以改善这一点。
  • 改进什么,究竟是什么? Lambda 背后的总体思想是一次调用 = 一项任务。如果您的处理是 CPU 密集型的,那么您的运行时间几乎是线性的——在一次调用中处理两个线程中的两个文件将花费与在两个调用中在一个线程中处理一个文件每个文件相同的实例时间......同时,将内存加倍将使运行时间减少大约一半,因为每次调用可用的 CPU 周期与您分配的内存成正比。 (没有别的原因,他们就是这样设计的。)
  • 我想缩短完成整个处理的时间。所以你的意思是说我应该每次都调用 lambda 函数,而不是使用线程,我的意思是对于每个图像我应该有一个不同的 lambda 函数。如果我错了,请纠正我。
  • 是的,就是这样。每个并发调用都在一个独立的容器中运行,您可以随时在您的帐户中运行多达 1,000 个容器,而无需任何预先配置——Lambda 将根据需要继续启动它们。如果在最近使用的空闲容器仍处于活动状态时调用该函数,它通常会从处理程序开始选择其中一个并重用它(这就是清理/tmp 很重要的原因)。否则容器会在几分钟内被销毁。但您只需在他们实际运行调用时付费。

标签: multithreading python-3.x amazon-web-services amazon-s3 lambda


【解决方案1】:

调用 lambda 方法 20k 次,传递它需要使用的文件名...不需要等待。每个 lambda 调用将处理每个文件。这样你就可以拥有 20k 个线程。

您可以创建规则,因此当新文件位于 S3 中时,会调用 lambda 方法。但第一批需要手动处理。

【讨论】:

  • 小心……否则月底账单会很高:)
  • 我知道这一点,但我正在寻找更好的解决方案。
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 2023-03-21
  • 2017-07-09
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多