首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制django网站的红色/芹菜任务?

如何控制django网站的红色/芹菜任务?
EN

Stack Overflow用户
提问于 2021-11-18 06:04:06
回答 1查看 239关注 0票数 0

我有一个django v3.0.2站点(pythonv3.6.9),我上传了一个图像,处理图像,然后在网站上显示它。通过对图像进行处理,生成不同大小的一幅图像,查找和识别人脸,在需要的情况下对任意文本进行ocr和翻译,使用几种不同的算法计算出每幅图像与其他图像的相似性程度,以及其他图像处理算法。我使用芹菜v4.3.0和redis v4.0.9在不同的芹菜任务背景下进行所有的计算。

我遇到的问题是,当我试图在一个循环中上传和处理超过4个图像时,内存耗尽,计算开始抛出异常。由于内存不足,我的5 GB交换空间和16 GB内存都用完了,而chrome甚至崩溃了。在我的数据库中,我记录每个任务的进度,以及它是否成功完成。我可以看到许多错误和许多任务还没有开始。

如果我将一个time.sleep(10)放在上传图像的循环中,并且在启动每个图像的芹菜工人之后,我就可以将60+图像上传到同一个循环中,而不会有任何异常、崩溃或任务日志中的错误。

我在googled上搜索了一些方法来控制芹菜的工人,所以我不需要使用sleep,并且发现芹菜在芹菜问题论坛上可能没有这种功能芹菜多工种限产。我发现这篇文章可能对芹菜节流.队列的设定率限制有帮助。

在我开始建立像上面提到的那样的东西之前,我想我应该问问集体意识是否有更好的(对吗?)用比time.sleep(10)更高效的方法来控制芹菜工人,这样我就不会耗尽内存并产生很多任务错误。

这里有太多的代码不能发布,所以这里是我正在做的事情的概述。

admin.py

代码语言:javascript
复制
def save_model(self, request, obj, form, change):
    if form.is_valid():
        if not change:
            files = request.FILES.getlist('storage_file_name')
            for f in files:
                obj = Document()       # model for each image
                # add some data to the model
                obj.save()
                time.sleep(10)
                doc_admin_workflow(<some parameters>)
        else:
            # some different housekeeping on the model fields
            doc_admin_workflow(<some different parameters>)
            super().save_model(request, obj, form, change)

def doc_admin_workflow(<some parameters>):
    if not change:
        # Decide which of the image processing steps to perform. 
        # Each processing step is a celery task of the form task_name.si(params)
        # in a list called 'jobs' ~ 3-5 tasks
        transaction.on_commit(lambda: chain(group(jobs), 
                              change_state_task.si(document_id, 'new')).delay()) 
        time.sleep(10) 
    else:
        # decide what other processing steps (i.e. celery tasks) to perform
        transaction.on_commit(lambda: chain(step_1, step_2, faces_2, ocr_job, 
                              change_state_task.si(document_id, 'ready')).delay())
        time.sleep(10)

上面使用的所有芹菜任务都是自成一体的,因为它们不将数据传递给下一个任务,也不以任何方式相互交互。他们只是计算和读/写数据库。

另外,这些上传是由管理员完成的网站。与网站交互的用户不向网站上传图像,也不使用图像处理芹菜任务。因此,time.sleep(10)是一个可能的解决方案,但它似乎是一个巨大的排他性和不太强。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-25 05:59:28

请参阅以下相关帖子的答案:芹菜红色的任务并不总是完成的

把所有的和弦和组从我的任务中删除,仅仅使用链子,似乎解决了内存不足的问题。现在没有必要节流芹菜任务,也不需要将任何time.sleep()语句放入流中。

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

https://stackoverflow.com/questions/70015231

复制
相关文章

相似问题

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