Я использую 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
функция to_xlsx()
возвращает книгу Excel в виде строки, используя save_virtual_workbook
из openpyxl.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 - это тот, который работает.