You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:20:27