芹菜:许多小任务或一项长期运行的任务



我有一个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用作消息经纪人。我目前正在使用一个背景工人。

芹菜文档有关任务粒度:

任务粒度是每个任务所需的计算量 子任务。通常,最好将问题分为许多 小任务,而不是执行一些长期运行的任务

有了较小的任务,您可以并行处理更多任务 任务的运行时间不会足够长以阻止工人处理其他 等待任务。

但是,执行任务确实有开销。一条消息必须是 已发送,数据可能不是本地等等。因此,如果任务太细粒度 添加的间接费用可能会删除任何好处。

因此,通常应该首选通常,但是您必须对特定情况进行基准评估开销。

相关内容

  • 没有找到相关文章

最新更新