9. Three classes (December 20)
17.3 / 17.4 cellery multi instance
Multiple worker s, multiple queues
[root@localhost celery]# cat tasks.py #!/usr/bin/env python #-*- coding:utf-8 -*- from celery import Celery app = Celery() app.config_from_object("celeryconfig") @app.task def taskA(x,y): return x + y @app.task def taskB(x,y,z): return x + y + z @app.task def add(x,y): return x + y [root@localhost celery]# cat celeryconfig.py #!/usr/bin/env python #-*- coding:utf-8 -*- from kombu import Exchange,Queue BROKER_URL = "redis://192.168.48.131:6379/1" CELERY_RESULT_BACKEND = "redis://192.168.48.131:6379/2" CELERY_QUEUES = ( Queue("default",Exchange("default"),routing_key="default"), Queue("for_task_A",Exchange("for_task_A"),routing_key="for_task_A"), Queue("for_task_B",Exchange("for_task_B"),routing_key="for_task_B") ) CELERY_ROUTES = { 'tasks.taskA':{"queue":"for_task_A","routing_key":"for_task_A"}, 'tasks.taskB':{"queue":"for_task_B","routing_key":"for_task_B"} }
Configuration files are usually written in a single file.
Start a worker to specify task a
celery -A tasks worker -l info -n workerA.%h -Q for_task_A celery -A tasks worker -l info -n workerB.%h -Q for_task_B from tasks import * re1 = taskA.delay(100, 200) print(re1.result) re2 = taskB.delay(1, 2, 3) print(re2.result) re3 = add.delay(1, 2, 3) print(re3.status) #PENDING
Multiple worker s, multiple queues
[root@localhost celery]# cat tasks.py #!/usr/bin/env python #-*- coding:utf-8 -*- from celery import Celery app = Celery() app.config_from_object("celeryconfig") @app.task def taskA(x,y): return x + y @app.task def taskB(x,y,z): return x + y + z @app.task def add(x,y): return x + y [root@localhost celery]# cat celeryconfig.py #!/usr/bin/env python #-*- coding:utf-8 -*- from kombu import Exchange,Queue BROKER_URL = "redis://192.168.48.131:6379/1" CELERY_RESULT_BACKEND = "redis://192.168.48.131:6379/2" CELERY_QUEUES = ( Queue("default",Exchange("default"),routing_key="default"), Queue("for_task_A",Exchange("for_task_A"),routing_key="for_task_A"), Queue("for_task_B",Exchange("for_task_B"),routing_key="for_task_B") ) CELERY_ROUTES = { 'tasks.taskA':{"queue":"for_task_A","routing_key":"for_task_A"}, 'tasks.taskB':{"queue":"for_task_B","routing_key":"for_task_B"} }
We see that the status is PENDING, which means no execution. This is because there is no cell config.py file to specify which Queue to change route to, so it will be launched to the Queue with the default name cell y, but we have not yet started the worker to execute the tasks in cell y. Next, let's start a worker to perform the tasks in the cellery Queue.
celery -A tasks worker -l info -n worker.%h -Q celery print(re3.status) #SUCCESS
17.5 cellery and scheduled tasks
Next, we add the celerybeat'schedule variable in cellerconfig.py:
CELERY_TIMEZONE = 'UTC' CELERYBEAT_SCHEDULE = { 'taskA_schedule' : { 'task':'tasks.taskA', 'schedule':20, 'args':(5,6) }, 'taskB_scheduler' : { 'task':"tasks.taskB", "schedule":200, "args":(10,20,30) }, 'add_schedule': { "task":"tasks.add", "schedule":10, "args":(1,2) } }
Pay attention to the format, otherwise there will be problems