问题描述
我正在与Django和Celery一起异步发送send_mass_mail。当我调用调用任务的视图函数时,出现以下错误:
[2020-09-08 17:47:49,148:错误/ ForkPoolWorker-8]任务main_app.tasks.send_notice [244944f6-604c-47a0-901a-4c510563d76e]引发意外:DoesNotExist('Notice匹配查询不存在。')
这仅在我使用延迟时发生。如果我调用send_notice_task(notice_id)而不是send_notice_task.delay(notice_id),它可以找到通知,但随着时间的推移,它会不断抛出该错误。有什么想法吗?
/views.py
def notice_approve(request,notice_id):
notice = Notice.objects.get(id=notice_id)
notice.approve()
# send_notice_task(notice_id)
send_notice_task.delay(notice_id)
return redirect('manage')
/tasks.py
def send_notice_task(notice_id):
print(notice_id)
notice = Notice.objects.get(id=notice_id)
subscribers = Subscriber.objects.filter(approved=True)
recipient_list = []
for sub in subscribers:
recipient_list.append(sub.email)
datatuple = (f'{notice.subject} - Notice',html_message,'CONCERN Network <cnb@gmail.com>',recipient_list)
send_mass_mail((datatuple,),fail_silently=False)
解决方法
我有一个类似的问题。
原因:之所以发生这种情况,是因为任务在查询命中数据库之前就已运行
解决方案:因此,强迫任务等待3秒钟才能运行,对我来说还是解决了。
例如,通过更改
send_notice_task.delay(notice_id)
到
send_notice_task.apply_async((order.id,),countdown=3)