在Django中使用Celery时,s()和si()方法为何无法正常执行?
问题解答
首先明确:add.s() 和 add.si() 并非在Django中无法工作,而是你用错了使用方式——这两个方法的核心作用是创建任务签名(Signature),而非直接触发任务执行。
核心差异说明
add.delay(3,4):是apply_async()的快捷封装,调用后会直接把任务发送到Celery队列,触发worker执行,所以你能看到实时的执行日志。add.s(3,4)/add.si(3,4):仅生成一个包含任务参数、配置的签名对象,相当于任务的"预定义模板",本身不会主动提交任务到队列,自然不会产生执行日志。
正确使用方式
如果要让签名对应的任务实际执行,需要调用签名对象的apply_async()方法,示例代码如下:
# store/views.py from django.http import HttpResponse from store.tasks import add def test(request): # 使用s创建签名并触发执行(会继承当前上下文) add.s(3, 4).apply_async() # 使用si创建签名并触发执行(si是immutable缩写,忽略上下文传递) add.si(3, 4).apply_async() return HttpResponse("任务已提交至Celery队列")
add.s()与add.si()的具体区别
add.s():会继承当前上下文(比如Django的数据库连接、请求上下文等),适合需要在任务中复用当前上下文的场景。add.si():全称signature(immutable=True),会忽略上下文传递,适合不需要上下文、或者要避免上下文干扰的场景。
按上述方式调用后,你就能在Celery worker的日志中看到类似delay()的执行输出,任务结果也会正常保存到django-celery-results中。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

