我有一个Django应用程序,并使用芹菜处理长期运行的任务。
假设我需要生成一个文件(耗时5秒),将其附加到电子邮件中并发送给1000个用户,这些方法中哪一种是首选的方法?
方法1:For循环外部任务-生成数字背景任务,每个任务运行几秒钟
@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:For循环内部任务-生成一个可能运行数小时的后台任务
@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作为消息代理。我目前使用的是单个后台工作人员。
发布于 2017-09-01 11:58:24
芹菜在任务粒度上的应用
任务粒度是每个子任务所需的计算量。一般来说,最好将问题分解成许多小任务,而不是有几个长时间运行的任务。 对于较小的任务,您可以并行处理更多的任务,并且这些任务不会运行足够长的时间来阻止工作人员处理其他等待任务。 但是,执行任务确实有开销。需要发送消息,数据可能不是本地的,所以如果任务粒度太细,所增加的开销可能会消除任何好处。
因此,通常应该首选第一种方法,但您必须对特定情况进行基准测试,以评估开销。
https://stackoverflow.com/questions/45999538
复制相似问题