4

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

我正在为我的网站构建报告引擎。而且我有大量(并且随着时间的推移越来越大)的数据,以及一些必须应用于它的算法。计算承诺会占用大量资源,如果它们是由用户请求执行的,那就太愚蠢了。因此,我认为将它们放入后台进程,该进程将连续执行并不时返回结果,这可以提供给 Django 视图例程,以根据需要生成 html 输出。

我的问题是——构建这样的系统有什么合适的设计方法?有什么想法吗?

4

3 回答 3

3

芹菜是你最好的选择之一。我们正在成功使用它。它具有强大的调度机制 - 您可以将任务安排为定时作业,也可以在用户(例如)请求时在后台触发任务。

它还提供了查询此类后台任务状态的方法,并具有许多流控制功能。它允许非常轻松地分配工作 - 即您的 celery 后台任务可以在单独的机器上运行(这对于例如 heroku web/workers 拆分非常有用,其中 web 进程限制为每个请求最多 30 秒)。它提供了各种队列后端(它可以使用数据库、rabbitMQ 或许多其他队列机制。通过最简单的设置,它可以使用您的 Django 站点已经使用的相同数据库(这使得设置变得容易)。

如果您使用自动化测试,它还有一个有助于测试的功能——它可以设置为“急切”模式,后台任务不在后台执行——从而提供可预测的逻辑测试。

更多信息在这里:http ://docs.celeryproject.org:8000/en/latest/django/

于 2012-12-29T13:06:16.127 回答
0

你的意思是结果被返回到数据库中,或者你想直接从你独立运行的代码中创建 django-views?

如果您有大量数据,我喜欢使用 Pythons multiprocessing。您可以创建一个生成器,其中填充了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()
于 2012-12-08T19:21:10.323 回答
0

为什么你没有一个 url 或 python 脚本来触发你每次运行时需要完成的任何类型的计算,然后获取该 url 或通过服务器上的 cronjob 运行该脚本?从您的问题来看,您似乎不需要更多。

于 2012-12-09T00:25:17.647 回答