python - 将参数传递给自定义 celery 任务
问题描述
我只是想知道将参数传递给自定义任务装饰器的正确方法是什么。例如,我发现我可以将 celery 任务子类化如下:
class MyTask(celery.Task):
def __init__(self):
# some custom stuff here
super(MyTask, self).__init__()
def __call__(self, *args, **kwargs):
# do some custom stuff here
res = self.run(*args, **kwargs)
# do some more stuff here
return res
并使用它如下:
@MyTask
def add(x, y):
return x + y
但我希望能够将一个参数传递给这个任务,并让它根据参数(或等效地,根据它正在装饰的函数)表现不同。我可以想到两种方法来做到这一点。一种是通过将额外的 kwarg 传递给 celery 的任务包装器并明确指定基数,例如
@celery.task(base=MyTask, foo="bar")
def add(x, y):
return x + y
我可以在我的自定义任务中访问它self.foo
,但这对我来说有点像作弊。另一种方法是检查self.task
,并根据其值更改行为,但这似乎也有点矫枉过正。理想情况下,我想将 kwarg 直接传递给自定义任务类,
@MyTask(foo="bar")
def add(x, y):
return x + y
但是当然这会创建一个 的实例MyTask
,我们不希望它也不会工作。
关于这样做的正确方法有什么建议吗?
解决方案
您可以添加使用类成员而不是实例成员。__init__
因此,您将在 in之外定义您的参数MyTask
,如下所示。然后,您可以将此类用作 celery 任务的基类,并将这些新的类成员用作自定义任务的参数。
注意:不幸的是,您不能将它们传递给__init__
您,因为您需要MyTask
在装饰时实例化。
class MyTask(celery.Task):
foo = "default"
def __init__(self):
# some custom stuff here
super(MyTask, self).__init__()
def __call__(self, *args, **kwargs):
# do some custom stuff here
print(self.foo)
res = self.run(*args, **kwargs)
# do some more stuff here
return res
然后你可以使用:
@celery.task(base=MyTask, foo="bar")
def add(x, y):
return x + y
推荐阅读
- r - R - 将存储为字符串的类别相加然后重新转换为字符串的最佳方法?
- google-sheets - 从另一个单元格中搜索一个单元格中的任何单词
- android - 如何从android中的sqlite数据在android中创建多页pdf文件?
- django - Django 中的 Paytm 支付集成
- c# - 在表单中使用自定义 WinForms 控件时出现 ArgumentNullException
- ubuntu - 无法在 Ubuntu 16 上安装 pycharm - 无法初始化类 java.awt.Color
- android - 如何在 Android Studio 终端中运行 gradle 命令?
- arrays - 将对象数组转换为具有相似字段值的数组对象
- apache-spark - 在反向代理后面运行历史服务器
- python - 我有一个 csv 保存在谷歌云存储的存储桶中。每行都有我要传输到 DataStore 的数据。如何逐行读取 csv?