首页 > 解决方案 > 在 Celery Signal 调用后发送事件

问题描述

我有一个 Django 项目并调用一个名为的任务my_task并收听该任务发送的不同信号。我在我的项目中使用 django_eventstream 发送到我的事件流。 from django_eventstream import send_event

after_task_publish当我通过以下方式收听 celery 内置信号时

@after_task_publish.connect(sender='my_task')
def task_sent_handler(sender=None, headers=None, body=None, **kwargs):
    print("task_sent")
    message = "task_sent"
    send_event("eventchannel", "my_event", message)

消息被发送到我现有的事件流,并且按预期工作。print 语句被打印到 webserver 控制台

task_success但是当我通过以下方式收听 celery 内置信号时

@task_success.connect(sender=my_task)
def task_success_handler(sender=None, result=None, **kwargs):
    print("task_success")
    message = "task_success"
    send_event("eventchannel", "my_event", message)

send_event 不会发送到我的事件流。print 语句将打印到 celery 工作控制台。我正在努力寻找这种行为的原因。两个信号之间有什么区别,或者由信号触发的两个功能之间有什么区别?

使用以下版本:

Django=3.2.6
celery=5.1.2
redis=3.5.3
django-eventstream=4.2.0

更新:

当我在task_success_handler()执行后重新启动开发服务器时,现有的 EventSource 被关闭并创建了一个新的 EventSource,然后发送的消息send_event()到达客户端的 Eventstream。

标签: djangoceleryevent-stream

解决方案


推荐阅读