[英]python function using celery apply_sync, issue with parsing args
我有一个应该运行后台进程的芹菜应用程序,这就是它的样子
task = render_image.apply_async(kwargs={
'image': image,
'pos': (x, y),
'deviation': variance,
'switch': switch_color,
'perspective': keep_perspective,
'colors': colors,
'new_color': new_color,
'color': colour,
'area_id': area_id,
'cls_id': cls_id,
'grayscale': grayscale,
'unique_processing_id': unique_processing_id, #line number 394
})
为行号添加了 394
这调用了一个函数 render_image 链接到 celery 应用程序,看起来像这样
from revamp.celery import app
@app.task(bind=True)
def render_image(image, pos, deviation, switch, perspective, colors, new_color, color, area_id, cls_id, grayscale, unique_processing_id):
...
在运行这个我得到这个错误
File "/home/samuel/Documents/code/revamp/gallery/views.py", line 394, in start_render_part
'unique_processing_id': unique_processing_id,
File "/usr/local/lib/python2.7/dist-packages/celery/app/task.py", line 518, in apply_async
check_arguments(*(args or ()), **(kwargs or {}))
TypeError: render_image() got multiple values for keyword argument 'image'
决定我可以将其简化为
task = render_image.apply_async(image, (x, y), variance, switch_color, keep_perspective, colors, new_color, colour, area_id, cls_id, grayscale, unique_processing_id)
然后我得到了这个错误
Internal Server Error: /start-render-part
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/channels/handler.py", line 243, in process_exception_by_middleware
return super(AsgiHandler, self).process_exception_by_middleware(exception, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/samuel/Documents/code/revamp/gallery/views.py", line 382, in start_render_part
task = render_image.apply_async(image, (x, y), variance, switch_color, keep_perspective, colors, new_color, colour, area_id, cls_id, grayscale, unique_processing_id)
TypeError: apply_async() takes at most 8 arguments (13 given)
注意到由于这是通过apply_async
文档: http ://docs.celeryproject.org/en/latest/reference/celery.app.task.html 应该更像这样
task = render_image.apply_async(args={
'image': image,
'pos': (x, y),
'deviation': variance,
'switch': switch_color,
'perspective': keep_perspective,
'colors': colors,
'new_color': new_color,
'color': colour,
'area_id': area_id,
'cls_id': cls_id,
'grayscale': grayscale,
'unique_processing_id': unique_processing_id,
})
但我得到一个丢失的参数错误可能是自己
Internal Server Error: /start-render-part
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/channels/handler.py", line 243, in process_exception_by_middleware
return super(AsgiHandler, self).process_exception_by_middleware(exception, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/samuel/Documents/code/revamp/gallery/views.py", line 394, in start_render_part
'unique_processing_id': unique_processing_id,
File "/usr/local/lib/python2.7/dist-packages/celery/app/task.py", line 518, in apply_async
check_arguments(*(args or ()), **(kwargs or {}))
TypeError: render_image() takes exactly 12 arguments (13 given)
这让我假设 render_image 需要一个“self”参数。
这里的定义
args (Tuple) – 传递给任务的位置参数
kwargs (Dict) – 传递给任务的关键字参数。
如果您需要传递 dict 值,请使用 kwargs,如果您需要传递可以接受元组或列表的参数
render_image.apply_async(args=[
image,
(x, y),
variance,
switch_color,
keep_perspective,
colors,
new_color,
area_id,
cls_id,
grayscaleunique_processing_id
])
如果您了解更多信息,请参阅文档apply_async函数
如果你用@app.task(bind=True)
装饰你的任务,那么传递给任务的第一个参数将是self
。
从芹菜文档:
绑定的任务意味着任务的第一个参数将始终是任务实例(self),就像 Python 绑定方法一样:
因此,将 self 作为第一个参数添加到您的任务函数render_image
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.