11

我很惊讶在搜索如何将 celery 任务与 sorl-thumbnails 和 S3 一起使用时,除了“使用 celery”之外什么都没有看到。

问题:使用远程存储在生成缩略图时会导致大量延迟(对于具有许多缩略图的页面,想想 100 秒以上),而缩略图引擎从远程存储下载原件,对其进行处理,然后上传回 s3。

在 sorl 中设置 celery 任务的好地方在哪里,我应该叫什么?

您的任何经验/想法将不胜感激。

我将开始挖掘 Sorl 的内部结构,以找到一个更有用的地方来延迟这项任务,但我还想知道之前是否已经解决了一些问题。

  1. 立即返回什么图像?必须以某种方式告诉 Sorl 返回的图像不是真正的缩略图。当 celery 完成任务时,缓存必须失效。

  2. 干净地处理多个缩略图生成请求(只需要给定缓存键的第一个请求)

目前,我通过使用 nginx 反向代理缓存暂时解决了这个问题,该缓存可以在后端花费时间生成昂贵的页面(在巨大的产品网格上调整巨大的 PNG 大小)时提供命中服务,但这是一个非常手动的过程。

4

3 回答 3

4

据我了解,Sorl 可以与 S3 存储一起正常工作,但速度很慢。

我相信你知道你需要什么图像尺寸。

上传图片后,您应该启动 celery 任务。在您调用的任务中 sorl.thumbnail.default.backend.get_thumbnail(file, geometry_string, **options)

Sorl 将生成一个缩略图并将其上传到 S3。下次您从模板请求图像时,它已经缓存并直接从亚马逊的服务器提供

一种在处理图像时处理占位符缩略图的干净方法。

为此,您需要覆盖 Sorl 后端。向函数添加新参数get_thumbnail,例如generate=False. 当你从 celery pass 调用这个函数时generate=True

在函数更改中它的逻辑,所以如果 thumb 不存在并且generate是 True 你就像标准后端一样工作,但如果generate是 false 你返回你的占位符图像,带有文本,如“我们现在处理你的图像,稍后再回来”并且不要打电话backend._create_thumbnail。如果您认为缩略图可能会被意外删除,您可以在这种情况下启动任务。

我希望这有帮助

于 2012-06-15T09:32:59.837 回答
4

我认为您想要做的是将THUMBNAIL_BACKEND设置为覆盖_create_thumbnail方法的自定义类。不是在该函数中生成缩略图,而是启动一个调用 _create_thumbnail 的 celery 任务,其参数与给定函数的参数相同。缩略图在请求期间将不可用,但会在后台生成。

于 2012-06-14T18:16:45.717 回答
3

您可以使用Sollery。它结合了 sorl 和 celery 通过工人创建缩略图。非常小心不要在工作线程之外进行任何文件系统访问。

THUMBNAIL_DUMMY_SOURCE可以通过将您设置为适当的占位符来控制立即返回的缩略图(在工作人员有机会之前) 。

该作业在第一次请求缩略图时创建,后续请求将提供虚拟图像,直到工作线程完成。

于 2013-05-25T17:08:47.157 回答