另一个文件中的函数调用在 Django rest 框架中不起作用

问题描述

我正在使用 Django 信号触发任务(使用 Django celery 包向订阅者发送大量电子邮件),当管理员发布博客文章时,该任务是从 Django 管理员创建的。信号被触发但任务文件中的任务函数没有被调用。因为我在任务函数里面放了一个不打印的打印函数

我的 signlas.py 文件

from apps.blogs.celery_files.tasks import send_mails
from apps.blogs.models import BlogPost,Subscribers
from django.db.models.signals import post_save
from django.dispatch import receiver

def email_task(sender,instance,created,**kwargs):
    if created:
        print("@signals.py")
        send_mails.delay(5)


post_save.connect(email_task,sender=BlogPost,dispatch_uid="email_task")

我的 task.py 文件

from __future__ import absolute_import,unicode_literals
from celery import shared_task
# from celery.decorators import task
from apps.blogs.models import BlogPost,Subscribers
from django.core.mail import send_mail
from travel_crm.settings import EMAIL_HOST_USER
from time import sleep

@shared_task
def send_mails(duration,*args,**kwargs):
    print("@send_mails.py")
    subscribers = Subscribers.objects.all()
    blog = BlogPost.objects.latest('date_created')
    for abc in subscribers:
        sleep(duration)
        print("i am inside loop")
        emailad = abc.email
        send_mail('New Blog Post ',f" Checkout our new blog with title {blog.title} ",EMAIL_HOST_USER,[emailad],fail_silently=False)

这里。不执行 print("@send_mails.py") 但执行了signals.py文件中的 print("@signals.py") 。因此,在创建 Blogpost 模型对象后接收信号,但不会执行 task.py 中的 send_mails 函数

我已经安装了 celery 和 redis 服务器,并且都运行良好。

主要的是,如果我从信号文件删除 .delay(5) 而只是在 email_task 中使用 send_mails() ,它可以完美运行并且我正在收到电子邮件。但是一旦我添加了 delay() 函数,任务文件中的功能就不会被调用。这是什么问题??

运行工人信息时的回溯:

-------------- celery@DESKTOP-AQPSFR9 v5.1.2 (sun-harmonics)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2021-07-18 11:06:10
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         travel_crm:0x15c262afcd0
- ** ---------- .> transport:   redis://localhost:6379//
- ** ---------- .> results:     redis://localhost:6379/
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . apps.blogs.celery_files.celery.debug_task
  . apps.blogs.celery_files.tasks.send_mails
  . travel_crm.celery.debug_task

[2021-07-18 11:06:11,465: INFO/SpawnPoolWorker-1] child process 9276 calling self.run()
[2021-07-18 11:06:11,475: INFO/SpawnPoolWorker-2] child process 8792 calling self.run()
[2021-07-18 11:06:11,496: INFO/SpawnPoolWorker-4] child process 1108 calling self.run()
[2021-07-18 11:06:11,506: INFO/SpawnPoolWorker-3] child process 7804 calling self.run()
[2021-07-18 11:06:13,145: INFO/MainProcess] Connected to redis://localhost:6379//
[2021-07-18 11:06:17,206: INFO/MainProcess] mingle: searching for neighbors
[2021-07-18 11:06:24,287: INFO/MainProcess] mingle: all alone
[2021-07-18 11:06:32,396: WARNING/MainProcess] c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
            leak,never use this setting in production environments!
  warnings.warn('''Using settings.DEBUG leads to a memory

[2021-07-18 11:06:32,396: INFO/MainProcess] celery@DESKTOP-AQPSFR9 ready.
[2021-07-18 11:06:32,596: INFO/MainProcess] Task apps.blogs.celery_files.tasks.send_mails[6bbac0ae-8146-4fb0-b64b-a07755123e1d] received
[2021-07-18 11:06:32,612: INFO/MainProcess] Task apps.blogs.celery_files.tasks.send_mails[25d3b32a-f223-4ae4-812b-fa1cfaedaddd] received
[2021-07-18 11:06:34,633: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3,got 0)')
Traceback (most recent call last):
  File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\billiard\pool.py",line 362,in workloop
    result = (True,prepare_result(fun(*args,**kwargs)))
  File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\celery\app\trace.py",line 635,in fast_trace_task
    tasks,accept,hostname = _loc
ValueError: not enough values to unpack (expected 3,got 0)
[2021-07-18 11:06:34,got 0)

解决方法

堆栈跟踪有助于确定问题与调用 celery 函数有关。

ValueError: not enough values to unpack (expected 3,got 0)

这部分代码是什么:

send_mails.delay(5)

尝试使用 apply_async 调用函数。

send_mails.apply_async(args=(5,))

如果这不起作用,请从 *arg 中删除 **kwargsdef send_mails(duration):。我不明白为什么需要这些参数。

可以在此答案中找到更多信息:https://stackoverflow.com/a/48910727/7838574

或在此处的文档中:https://docs.celeryproject.org/en/latest/userguide/calling.html#basics