我有许多Celery任务,它们是长期运行的进程。因此,我想实现自定义状态以查询其进度。
根据the documentation,为给定任务实现自定义状态非常容易。
def download_count(wget_base_path):
# recursively traverse root folder and return count of files
return sum([len(files) for r, d, files in os.walk(wget_base_path)])
@app.task(bind = True)
def html_download(self, url='', cl_id=-1):
log = get_logger(__name__)
...
# wget download location
wget_base_path = settings.WGET_PATH + str(cl_id)
os.system(wget_cmd)
if not self.request.called_directly:
log.debug('State progress called')
self.update_state(state = 'PROGRESS', meta = {'item_count' : download_count(wget_base_path)})
现在,当我通过
打电话时from app.ingest.tasks import html
ingest = html.html_download.delay(url, 54431)
这项工作按预期开始。但是,每当我尝试获取更新状态时,我都不会获得任何元数据。
例如,
In [6]: ingest.state
Out[6]: 'PENDING'
In [10]: ingest._get_task_meta()
Out[10]: {'result': None, 'status': 'PENDING'}
对于wget命令的os.system调用是否阻塞了所有内容?如果我使用subprocess
,则在执行chold过程时任务会很快完成。