我有一个简单的函数,遍历一个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,但这似乎对我想要执行的简单任务有点过分。
有什么简单的我可以做或者我必须使用芹菜吗?
答案 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)