完整步骤:
启动django
开始一个芹菜工人
python manage.py celery worker --app = celery_worker:app -Ofair -n W1
上传网址列表文件,循环网址列表将每个网址发送到任务fetch_article
工作者
上传其他网址列表文件
工人没有行动
views.py:
@csrf_exempt
def upload(request):
job_name = request.POST.get('job_name')
if not job_name:
return JsonResponse(JsonStatus.Error)
if len(request.FILES) == 1:
yq_data = request.FILES.values()[0]
else:
return JsonResponse(JsonStatus.Error)
job = Job.objects.create(name=job_name)
reader = csv.reader(yq_data, delimiter=',')
task_count = 0
next(reader)
for row in reader:
url = row[0].strip()
fetch_article.delay(job.id, url)
# fetch_article.apply_async(args=[job.id, url], queue=job.queue_name)
task_count += 1
# print 'qn%s' % job.queue_name
# rp = celery_app.control.add_consumer(queue=job.queue_name, reply=True)
# print rp
job.task_count = task_count
job.save()
return JsonResponse(JsonStatus.OK, msg=task_count)
tasks.py
@shared_task()
def fetch_article(job_id, url):
logger.info(u'fetch_article:%s' % url)
Processer = get_processor_cls(url)
a = Article(job_id=job_id, url=url)
try:
ap = Processer(url)
title, text = ap.process()
a.title = title
a.content = text
except Exception as e:
a.status = 2
a.error = e
logger.error(u'fetch_article:%s error:%s' % (url, e))
a.save()
答案 0 :(得分:0)
好的,我发现了问题。
因为我在设置中设置了CELERY_ALWAYS_EAGER = True
。
任务在django主进程中运行,所以工人没有动作
来自doc:
CELERY_ALWAYS_EAGER如果为True,则将执行所有任务 在本地通过阻塞直到任务返回。 apply_async()和 Task.delay()将返回一个EagerResult实例,该实例模拟 AsyncResult的API和行为,但结果已经存在 评价。
也就是说,任务将在本地执行而不是发送给 队列中。
对于第一次工人工作,我仍然感到困惑,可能是以前工作队列中有一些网址。