Celery调用任务的方法delay()和apply_async()的区别

celey调用任务的其中两个方法,分别是delay()和apply_async()方法,例:

@celery_app.task
def test():
    print('success')

test.delay()
test.apply_async()

在上述代码中,delay()和apply_async()的作用是一样的。那它们的区别是什么呢?可参考以下例子。

@celery_app.task
def test(arg1, arg2, kwarg1=None, kwarg2=None):
    print('success')

test.delay('a', 'b', kwarg1='x', kwarg2='y')
test.apply_async(args=['a', 'b'], kargs={'kwarg1': 'x', 'kwarg2': 'y'})

如上所示, delay()接收的参数会全部传递到任务函数test,而apply_async()则不是,其接收的参数只有args和kargs会传递给任务函数test。这是因为apply_async()还可以接收一些执行任务的参数选项。包括以下常用参数:

  • link 该参数接收一个回调函数或者函数列表,将在主任务完成后执行
  • link_error 该参数接收一个回调函数或者函数列表,将在主任务执行出错后执行
  • countdown 接收一个数字,任务将在countdown秒后执行
  • eta 接收一个datetime对象,任务将在该时间执行
  • expires 接收一个数字或者datetime对象,任务的到期时间

其他一些参数可参见文档 http://docs.jinkan.org/docs/celery/userguide/calling.html

现在,想将任务在一年后执行,则只能使用apply_async()了

@celery_app.task
def test(arg1, kwarg1=None):
    print('success')

test.apply_async(args=['a'], kargs={'kwarg1': 'x'}, countdown=365*24*60*60)
test.apply_async(args=['a'], kargs={'kwarg1': 'x'}, eta=datetime.now() + timedelta(days=365))
Show Comments