Python Django-如何设置异步长期后台数据处理任务?
关于Django应用程序设计的新问题: 我正在为我的网站构建报告引擎。我有大量(并且随着时间的推移越来越大)的数据,以及一些必须应用到其中的算法。计算可能会占用大量资源,如果由用户请求执行,那将是愚蠢的。所以,我想把它们放在后台进程中,这个进程将持续执行,并不时返回结果,这些结果可以馈送到Django视图例程,以便按需生成html输出Python Django-如何设置异步长期后台数据处理任务?,python,django,background-process,backend,Python,Django,Background Process,Backend,关于Django应用程序设计的新问题: 我正在为我的网站构建报告引擎。我有大量(并且随着时间的推移越来越大)的数据,以及一些必须应用到其中的算法。计算可能会占用大量资源,如果由用户请求执行,那将是愚蠢的。所以,我想把它们放在后台进程中,这个进程将持续执行,并不时返回结果,这些结果可以馈送到Django视图例程,以便按需生成html输出 我的问题是,建立这样的系统需要什么样的设计方法?有什么想法吗?您的意思是将结果返回到数据库中,还是希望直接从独立运行的代码创建django视图 如果您有大量数据,
我的问题是,建立这样的系统需要什么样的设计方法?有什么想法吗?您的意思是将结果返回到数据库中,还是希望直接从独立运行的代码创建django视图 如果您有大量数据,我喜欢使用Pythons
多处理
。您可以创建一个生成器,用不同的任务来填充JoinableQueue
,以及使用不同任务的工作人员池。这样,您应该能够最大限度地提高系统上的资源利用率
多处理模块还允许您通过网络执行多项任务(例如,multiprocessing.Manager()
)。考虑到这一点,如果您需要第二台机器及时处理数据,您应该能够轻松地扩大规模
例子:
此示例演示如何生成多个进程。生成器功能应查询数据库中所有需要重载的新条目。消费者从队列中取出单个项目并进行实际计算
import time
from multiprocessing.queues import JoinableQueue
from multiprocessing import Process
QUEUE = JoinableQueue(-1)
def generator():
""" Puts items in the queue. For example query database for all new,
unprocessed entries that need some serious math done.."""
while True:
QUEUE.put("Item")
time.sleep(0.1)
def consumer(consumer_id):
""" Consumes items from the queue... Do your calculations here... """
while True:
item = QUEUE.get()
print "Process %s has done: %s" % (consumer_id, item)
QUEUE.task_done()
p = Process(target=generator)
p.start()
for x in range(0, 2):
w = Process(target=consumer, args=(x,))
w.start()
p.join()
w.join()
为什么没有一个url或python脚本,每次运行时都会触发所需的任何类型的计算,然后获取该url或通过服务器上的cronjob运行该脚本?从你的问题来看,你似乎不需要更多的东西。芹菜是你最好的选择之一。我们正在成功地使用它。它有一个强大的调度机制——您可以将任务作为定时作业进行调度,也可以在用户(例如)请求时在后台触发任务 它还提供了查询此类后台任务状态的方法,并具有许多流控制功能。它允许非常轻松地分配工作,即芹菜后台任务可以在单独的机器上运行(这非常有用,例如,对于heroku web/workers拆分,其中每个请求的web进程最多限制为30秒)。它提供了各种队列后端(它可以使用数据库、rabbitMQ或许多其他队列机制。通过最简单的设置,它可以使用Django站点已经用于此目的的相同数据库(这使得设置更容易) 如果您使用的是自动测试,那么它也有一个有助于测试的功能——它可以设置为“急切”模式,即后台任务不在后台执行——从而提供可预测的逻辑测试
此处的详细信息:“您是说结果将返回到数据库中,还是要直接从独立运行的代码创建django视图?”由于您说过需要处理的数据量很大,我建议您将数据保存到数据库中,并从django查询数据库。这样,如果您使用多处理且数据被持久化,则无需创建额外的通信方式。您只能使用django的一部分,以使数据库从其他代码部分访问,如和中所述。我的困惑在于如何在django中调用后台进程,注意它必须与请求无绑定-如何在服务器启动时启动此进程(或按计划启动),并继续执行?啊!现在我明白了。很抱歉造成混乱。我建议您只需在数据库中设置一个标志,上面写着“需要完成工作”。后台任务然后,只需查询数据库中打开的任务列表。我添加了一个示例,其中有一个使用者/生成器,可以稍微说明这一原理。此过程可以手动启动,也可以作为服务/守护进程启动。使其连续运行可以通过无限循环完成(例如,
while True:
)。只需确保您具有某种停止条件,以便可以优雅地终止:)此进程是否可以放在Django运行时,还是它的错误决定?顺便说一句,谢谢你!你看过芹菜了吗?它可以用来安排任务!