芹菜工人只工作一次

时间:2015-07-01 01:38:44

标签: python celery django-celery worker

完整步骤:

  1. 启动django

  2. 开始一个芹菜工人

    python manage.py celery worker --app = celery_worker:app -Ofair -n W1

  3. 上传网址列表文件,循环网址列表将每个网址发送到任务fetch_article

  4. 工作者

  5. 上传其他网址列表文件

  6. 工人没有行动

  7. 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()
    

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。

因为我在设置中设置了CELERY_ALWAYS_EAGER = True。 任务在django主进程中运行,所以工人没有动作

来自doc:

  

CELERY_ALWAYS_EAGER如果为True,则将执行所有任务   在本地通过阻塞直到任务返回。 apply_async()和   Task.delay()将返回一个EagerResult实例,该实例模拟   AsyncResult的API和行为,但结果已经存在   评价。

     

也就是说,任务将在本地执行而不是发送给   队列中。

对于第一次工人工作,我仍然感到困惑,可能是以前工作队列中有一些网址。