基本上我在芹菜上运行两个工人,不同的模块和不同的队列但是相同的rabbitmq
celery worker -l info -A module_name.main.tasks -Q queue_one
celery worker -l info -A module_name.sub.sub_task -Q queue_two
当我尝试对1个模块上的第一个任务进行速率限制时,我从第二个工作人员运行另一个模块时得到此错误..
app.control.rate_limit('module_name.main.tasks.method', '30/m')
未知任务的速率限制尝试
我更希望速率限制调用是针对正在处理该模块的工作人员而不是针对那些不在该模块上工作的其他工作人员。
任何想法如何解决这个问题?
更新:添加代码:
celery_worker_base.py:
from __future__ import absolute_import
from celery import Celery
app = Celery('poc',
backend='mongodb://user:pass@ip:27017/collection',
broker='amqp://user:pass@ip/vhost',
include=['poc.main.proj.tasks'])
# Optional configuration, see the application user guide.
app.conf.update(
CELERY_TASK_RESULT_EXPIRES=3600,
CELERY_ROUTES = {'poc.main.proj.tasks': {'queue': 'proj_tasks'}}
)
app.control.rate_limit('poc.main.proj.tasks.get', '30/m')
app.control.rate_limit('poc.main.proj.tasks.compute', '30/m')
if __name__ == '__main__':
app.start()
芹菜工人代码:tasks.py
from __future__ import absolute_import
from poc.celery.celery_worker_base import app
@app.task
def get(url):
print "calling get"
@app.task
def compute(info):
print "calling compute"
另一个模块:celery_master.py
from __future__ import absolute_import
from celery import Celery
from datetime import timedelta
from poc.config.config import *
from boto import ec2
master_app = Celery('poc',
backend='mongodb://user:pass@ip:27017/collection',
broker='amqp://user:pass@ip/vhost',
include=['poc.main.proj.tasks'])
# Optional configuration, see the application user guide.
master_app.conf.update(
CELERY_TASK_RESULT_EXPIRES=3600,
CELERYBEAT_SCHEDULE = {
'instance-check-every-fifteen-minute': {
'task': 'poc.main.instance.check.check_count',
'schedule': timedelta(seconds=900),
'options': {'queue' : 'instance_check'}
}
},
CELERY_ROUTES = {'poc.main.instance.check': {'queue': 'instance_check'}},
CELERY_TIMEZONE = 'UTC'
)
region = ec2.connect_to_region(
REGION,
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY
)
if __name__ == '__main__':
master_app.start()
主工:check.py
from __future__ import absolute_import
from celery import Celery
from poc.config.config import *
from poc.celery.celery_master import master_app, region
@master_app.task
def check_count():
print "calling check"
PS:谢谢你不要对这个问题进行投票。
答案 0 :(得分:0)
关于芹菜无法找到任务,我会确保你根据app.control.app.tasks
列出的方式传递它们。
这提供了已知任务的词典,其中键是有资格传递给control.rate_limit()
的。