我在任务队列中使用剧作家q,它提供装饰器@dramatiq.actor,将函数装饰为一个任务。我尝试自己编写包装@dramatiq.actor装饰器的装饰器,以便向适用于所有任务的@dramatiq.actor装饰器中添加一个默认参数(我正在讨论的参数是priority=100)。
由于某些原因,我得到了以下错误:
TypeError: foobar() takes 1 positional argument but 3 were given如果我将我的自定义@task装饰器换成@dramatiq.actor,它会工作,所以我想我的定制装饰器是不正确的,但是我找不到我的错误。
decorators.py
def task(func=None, **kwargs):
def decorator(func):
@wraps(func)
@dramatiq.actor(priority=100, **kwargs)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
if func is None:
return decorator
return decorator(func)tasks.py
@task
def foobar(entry_pk):
...views.py
foobar.send_with_options(args=(entry.pk,))发布于 2020-01-07 14:15:20
使用functools.partial要容易得多
from functools import partial
task = partial(dramatiq.actor, priority=100)
@task
def foobar(*args, **kwargs):
...这允许您先发制人地向函数添加参数,而不必实际调用它。
发布于 2020-01-29 19:50:26
另一种方法是子类Dramatiq类并重写actor方法。这种方法加上这里描述的其他一些技巧- https://blog.narrativ.com/converting-celery-to-dramatiq-a-py3-war-story-23df217b426
https://stackoverflow.com/questions/59630018
复制相似问题