celery中bind = True关键字的含义是啥?

Posted

技术标签:

【中文标题】celery中bind = True关键字的含义是啥?【英文标题】:What is the meaning of bind = True keyword in celery?celery中bind = True关键字的含义是什么? 【发布时间】:2019-07-20 19:29:00 【问题描述】:

下面celery代码中bind=True是什么意思?什么时候用什么时候不用?

@app.task(bind=True)
def send_twitter_status(self, oauth, tweet):
    try:
        twitter = Twitter(oauth)
        twitter.update_status(tweet)
    except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
        raise self.retry(exc=exc)

【问题讨论】:

【参考方案1】:

bind 参数意味着该函数将是一个“绑定方法”,以便您可以访问任务类型实例上的属性和方法。

见docs

【讨论】:

【参考方案2】:

绑定任务

一个任务被绑定意味着任务的第一个参数总是任务实例(self),就像Python绑定方法

logger = get_task_logger(__name__)

@task(bind=True)
def add(self, x, y):
    logger.info(self.request.id)

【讨论】:

【参考方案3】:

只是对其他答案的一个小补充。如前所述,bound tasks 可以访问任务实例。需要重试的一个用例是:

@celery.task(bind=True, max_retries=5)
def retrying(self):
    try:
        return 1/0
    except Exception:
        self.retry(countdown=5)

另一个用例是当您想为您的任务定义custom states 并能够在任务执行期间设置它:

@celery.task(bind=True)
def show_progress(self, n):
    for i in range(n):
        self.update_state(state='PROGRESS', meta='current': i, 'total': n)

【讨论】:

以上是关于celery中bind = True关键字的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 dask 或 Dramatiq 中带有 (bind=True) 的芹菜?

在 Celery 任务中使用 GeoIP 进行地理定位的正确方法

在 Celery 任务之间共享一个通用的实用函数

python celery 错误重试配置

python celery 错误重试配置

celery异步发送短信