如何在django视图

时间:2016-02-29 12:34:41

标签: python django multiprocessing

我有一个简单的函数,遍历一个URL列表,使用GET检索一些信息并相应地更新数据库(PostgresSQL)。功能完美。但是,每次访问每个URL一次会说太多时间。

使用python,我能够跟随并行执行这些任务:

from multiprocessing import Pool

def updateDB(ip):
     code goes here...

if __name__ == '__main__':
    pool = Pool(processes=4)              # process per core
    pool.map(updateDB, ip)

这很好用。但是,我试图在django项目中找到相同的方法。目前我有一个函数(视图)遍历每个URL以获取信息,并更新数据库。

我唯一能找到的就是使用Celery,但这似乎对我想要执行的简单任务有点过分。

有什么简单的我可以做或者我必须使用芹菜吗?

3 个答案:

答案 0 :(得分:2)

尽管使用Celery似乎有些过分,但这是一种众所周知的异步任务方式。本质上,Django提供WSGI请求 - 响应周期,它对多处理或后台任务一无所知。

以下是备选方案:

答案 1 :(得分:1)

  

目前我有一个功能(视图),遍历每个URL以获取   信息,并更新数据库。

这意味着响应时间对您来说无关紧要,而不是在后台(异步)执行它,如果您的响应时间减少4(使用4个子进程/线程),您可以在前台执行它。如果是这种情况,您只需将示例代码放在视图中即可。像

shareIntent.putParceble(imageBitmap)

但是,如果你想在后台异步进行,那么你应该使用Celery或者遵循@ BasicWolf的建议。

答案 2 :(得分:0)

我建议使用gevent进行多线程解决方案而不是多处理。多处理可能会导致产生新进程受限制的生产环境出现问题。

示例代码:

from django.shortcuts import HttpResponse
from gevent.pool import Pool

def square(number):
    return number * number

def home(request):
    pool = Pool(50)
    numbers = [1, 3, 5]
    results = pool.map(square, numbers)
    return HttpResponse(results)