如何用一个工人执行多个django芹菜任务?

时间:2016-04-21 19:10:34

标签: django multithreading concurrency celery django-celery

这是我的芹菜文件:

from __future__ import absolute_import
import os
from celery import Celery


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ets.settings')

from django.conf import settings  # noqa

app = Celery('proj',

             broker='redis://myredishost:6379/0',
             backend='redis://myredishost:6379/0',
             include=['tracking.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600,
)

if __name__ == '__main__':
    app.start()

这是我的任务文件:

@app.task
def escalate_to_sup(id, group):
    escalation_email, created = EscalationEmail.objects.get_or_create()
    escalation_email.send()

    return 'sup email sent to: '+str(group)


@app.task
def escalate_to_fm(id, group):
    escalation_email, created = EscalationEmail.objects.get_or_create()
    escalation_email.send()

    return 'fm email sent to: '+str(group)

我这样开始工作:

celery -A ets worker -l info

我也试图像这样添加并发:

celery -A ets worker -l info --concurrency=10

我尝试使用以下内容调用上述任务:

from tracking.tasks import escalate_to_fm, escalate_to_sup

    def status_change(equipment):
            r1 = escalate_to_sup.apply_async((equipment.id, [1,2]), countdown=10)
            r2 = escalate_to_fm.apply_async((equipment.id, [3,4]), countdown=20)

            print r1.id
            print r2.id

打印:

  

c2098768-61fb-41a7-80a2-f79a73570966   23959fa3-7f80-4e20-a42f-eef75e9bedeb

escalate_to_sup和escalate_fm函数间歇性地登录到worker。至少有1个执行,但从不同时执行。

我尝试过更多的工作人员,然后执行这两项任务。我这样做:

celery -A ets worker -l info --concurrency=10 -n worker1.%h
celery -A ets worker -l info --concurrency=10 -n worker2.%h

问题是我不知道有多少任务可能同时执行,因此为每个可能执行的任务启动一个worker是不可行的。

芹菜是否期望为每项活动任务开展工作?

如何使用单个工作人员执行多项任务?

0 个答案:

没有答案