繁体   English   中英

如何在django视图中使用python多处理模块

[英]How to use python multiprocessing module in django view

我有一个简单的函数,遍历一个URL列表,使用GET来检索一些信息并相应地更新DB( 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,但这似乎对我想要执行的简单任务有点过分。

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

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

以下是备选方案:

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

这意味着响应时间对您来说无关紧要,而不是在后台(异步)执行它,如果您的响应时间减少4(使用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")

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

我建议使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM