Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-如何设置异步长期后台数据处理任务?_Python_Django_Background Process_Backend - Fatal编程技术网

Python Django-如何设置异步长期后台数据处理任务?

Python Django-如何设置异步长期后台数据处理任务?,python,django,background-process,backend,Python,Django,Background Process,Backend,关于Django应用程序设计的新问题: 我正在为我的网站构建报告引擎。我有大量(并且随着时间的推移越来越大)的数据,以及一些必须应用到其中的算法。计算可能会占用大量资源,如果由用户请求执行,那将是愚蠢的。所以,我想把它们放在后台进程中,这个进程将持续执行,并不时返回结果,这些结果可以馈送到Django视图例程,以便按需生成html输出 我的问题是,建立这样的系统需要什么样的设计方法?有什么想法吗?您的意思是将结果返回到数据库中,还是希望直接从独立运行的代码创建django视图 如果您有大量数据,

关于Django应用程序设计的新问题:

我正在为我的网站构建报告引擎。我有大量(并且随着时间的推移越来越大)的数据,以及一些必须应用到其中的算法。计算可能会占用大量资源,如果由用户请求执行,那将是愚蠢的。所以,我想把它们放在后台进程中,这个进程将持续执行,并不时返回结果,这些结果可以馈送到Django视图例程,以便按需生成html输出


我的问题是,建立这样的系统需要什么样的设计方法?有什么想法吗?

您的意思是将结果返回到数据库中,还是希望直接从独立运行的代码创建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运行时,还是它的错误决定?顺便说一句,谢谢你!你看过芹菜了吗?它可以用来安排任务!