【问题标题】:python function using celery apply_sync, issue with parsing args使用芹菜apply_sync的python函数,解析args的问题
【发布时间】:2017-09-13 07:48:11
【问题描述】:

我有一个 celery 应用程序,它应该运行一个后台进程,这就是它的样子

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 docs: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”参数。

【问题讨论】:

  • 下面我的解决方案似乎还可以??如果您遇到困难,请告诉我
  • 通过将 self 添加到 render_image 并保留 kwargs 来修复它,但谢谢
  • 我的回答对你来说似乎没问题
  • 不改代码不知道能不能工作

标签: python django-celery


【解决方案1】:

这里是定义

args (Tuple) – 传递给任务的位置参数

kwargs (Dict) – 传递给任务的关键字参数。

如果你需要传递dict值使用kwargs,如果你需要传递可以接受元组或列表的args

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 函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2023-03-27
    • 2017-12-16
    • 2011-09-26
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多