我有一个django应用程序,并使用芹菜处理长期运行的任务。
假设我需要生成一个文件(需要5秒),将其连接到电子邮件并将其发送给1000个用户,这些方法是首选的方法?
方法1 :对于循环外部任务 - 生成数字的背景任务,每个任务都运行了几秒钟
@share_task
def my_task(usr):
#gen file + send email...
def send_to_all_users(users): # called to start task
for usr in users:
my_task.delay(usr)
方法2 :对于内部任务循环 - 生成1个可以运行数小时的背景任务
@share_task
def my_task(users):
for usr in users:
#gen file + send email...
def send_to_all_users(users): # called to start task
my_task.delay(users)
使用方法1,我可以扩大工人的数量来更快地完成整个任务,但是创建所有这些任务可能需要一段时间,我不确定我的任务队列是否可以填写,然后丢弃工作?
方法2似乎更简单,但是它可能运行很长时间,我无法扩展工人的数量。
不确定是否重要,但是我的应用程序正在Heroku上运行,我将Redis用作消息经纪人。我目前正在使用一个背景工人。
芹菜文档有关任务粒度:
任务粒度是每个任务所需的计算量 子任务。通常,最好将问题分为许多 小任务,而不是执行一些长期运行的任务。
有了较小的任务,您可以并行处理更多任务 任务的运行时间不会足够长以阻止工人处理其他 等待任务。
但是,执行任务确实有开销。一条消息必须是 已发送,数据可能不是本地等等。因此,如果任务太细粒度 添加的间接费用可能会删除任何好处。
因此,通常应该首选通常,但是您必须对特定情况进行基准评估开销。