这可能是一个明显的上尉风格问题,但我觉得我错过了一些东西。
我继承了一个创建Celery任务的Python WSGI应用程序。看起来像这样:
#web.py
from bottle import route, run, request, response, abort
import bottle
from project.tasks import process_request
@route('/')
def web():
url = request.query_string
process_request.delay(
url=url,
path=request.path,
query=request.query_string,
cookies=dict(request.cookies),
headers=dict(request.headers),
remote_addr=request.remote_addr,
)
process_request
方法如下所示:
#tasks.py
@celery.task
def process_request(url, path, query, cookies, headers, remote_addr):
#does some stuff
以上所有作品。我试图在process_request中添加一个时间戳,所以调用如下所示:
#web.py
#imports from above
from datetime import datetime
@route('/')
def web():
url = request.query_string
process_request.delay(
url=url,
path=request.path,
query=request.query_string,
cookies=dict(request.cookies),
headers=dict(request.headers),
remote_addr=request.remote_addr,
s_time=str(datetime.now())
)
我将process_request
方法更改为:
#tasks.py
@celery.task
def process_request(url, path, query, cookies, headers, remote_addr, s_time):
#does some stuff
那不起作用。请求未被处理。我检查了我的celeryd日志文件,发现了这个:
[2013-03-26 16:19:03,330: ERROR/MainProcess] Task beacon.tasks.process_request[235f9fa8-1f10-4ee0-a1f9-e389021ea0ad] raised exception: TypeError('process_request() takes exactly 7 non-keyword arguments (6 given)',)
Traceback (most recent call last):
File "/home/beacon/.virtualenvs/beacon/lib/python2.6/site-packages/celery/task/trace.py", line 228, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/beacon/.virtualenvs/beacon/lib/python2.6/site-packages/celery/task/trace.py", line 415, in __protected_call__
return self.run(*args, **kwargs)
TypeError: process_request() takes exactly 7 non-keyword arguments (6 given)
我不知道我做错了什么。有人有什么想法吗?
答案 0 :(得分:1)
这里的问题是排队的任务使用旧的方法签名,没有timestamp变量。如果没有更多信息,很难确定您的最佳行动方案。
当前排队的任务是否至关重要?在我看来,解决这个问题最简单,最干净的方法是停止芹菜,通过Redis / RabbitMQ /清空队列,然后重启芹菜。此外,这应该不用说,确保您的任务函数接受新参数作为参数;)
答案 1 :(得分:0)
添加新任务,例如process_request_with_stime()
,保留旧任务process_request()
,并替换web()
中的调用。
部署
处理完任务process_request()
的所有旧排队作业后,删除process_request()
任务,将process_request_with_stime()
重命名为process_request()