繁体   English   中英

使用芹菜apply_sync的python函数,解析args的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM