首页 > 解决方案 > Celery 完成后将任务保存在内存中

问题描述

我正在使用 Django 和 Celery 来卸载长时间运行的任务。这一切都很好,除了当一项任务完成时,Celery 似乎将数据保存在内存中。

@shared_task
def export_xlsx():
    tmpfile = settings.FILE + ".tmp"
    with open(tmpfile, "w") as datafile:    
        datafile.write(to_xlsx())

    os.rename(settings.FILE + ".tmp", settings.FILE)

    return True

该函数使用fromto_xlsx()将 Excel 工作簿作为字符串返回:save_virtual_workbookopenpyxl.writer.excel

def to_xlsx():
    wb = Workbook()
    ws = wb.active

    col = 1
    row = 1

    articles = models.Article.objects.order_by('articleid')

    for article in articles:
        for articledescription in article.articledescription_set.all():
            ws.cell(row=row, column=1, value=article.articleid)
            ws.cell(row=row, column=3, value=articledescription.description)
            row += 1

    return save_virtual_workbook(wb)

似乎这个字符串永远不会从内存中释放出来:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                           
26536 bf        20   0 2763256 1.921g   9220 S   0.0 25.0   4:45.69 celery                                                                            
26538 bf        20   0 1550080 798892   7336 R  88.0  9.9   0:08.20 celery 

PID 26536 是一个已经完成的任务。26538 是一个正在运行的。

标签: djangomemory-leakscelery

解决方案


推荐阅读