2016-02-29 59 views
2

我有一个简单的函数来检查URL列表,使用GET来检索一些信息并相应地更新DB(PostgresSQL)。该功能完美。但是,一次一个地浏览每个URL会说多少时间。如何在django视图中使用python多重处理模块

使用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的函数(视图)来获取信息,并更新数据库。

我能找到的唯一东西就是使用芹菜,但是对于我想要执行的简单任务来说,这似乎有点压倒性。

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

+0

这是一个重复出现的任务吗?也许一个自定义管理命令作为cronjob运行是另一种选择。 – ilse2005

+1

这真的取决于你想要的响应时间。您可以让服务器在处理Celery任务后立即响应,或者可以执行多处理,然后仍需要一些时间。不过,不要打扰'多处理',我建议使用优秀的'joblib'库。 –

回答

0

目前我有去在每个URL获得 信息,并更新数据库的函数(视图)。

这意味着(使用4个子流程响应时间不要紧,你不是在后台(异步)做这件事,你是在前台做就OK了,如果你的响应时间由4切断/线程)。如果是这种情况,您可以简单地将您的示例代码放入您的视图中。像

from multiprocessing import Pool 

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

def my_view(request): 
    pool = Pool(processes=4)    # process per core 
    pool.map(updateDB, ip) 
    return HttpResponse("SUCCESS") 

但是,如果你希望异步做背景,那么你应该用芹菜或遵循@ BasicWolf的建议之一。

+0

这就是我的情况。我不需要在背景上运行任何东西(这就是为什么我发现芹菜不是最好的解决方案)。 我实际上已经尝试过你的建议,因为我认为它可能有效。但是,我收到了一个错误“模型尚未加载”。尽管这是不可能的。 你知道为什么会出现以下异常吗? 异常类型:\t AppRegistryNotReady 异常值:\t模型尚未加载。 –

+0

你的Django vesion是什么?在Django上为我工作1.8.2 –

+0

Django版本1.8.6 我会再次检查我的代码,以确保正确执行了所有更改。我想我会尝试一个新的简单功能。也许在我的代码中的其他东西制造麻烦。 –

2

虽然使用芹菜可能看起来是一种矫枉过正,但它是一种众所周知的异步任务方式。基本上,Django提供WSGI请求 - 响应循环,它对多处理或后台任务一无所知。

这里有替代方案:

1

我会推荐使用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)