首页 > 解决方案 > Django:for循环遍历并行进程并存储值并在完成后返回

问题描述

我在 django 中有一个 for 循环。它将遍历一个列表并从数据库中获取相应的数据,然后根据数据库值进行一些计算,然后将其附加到另一个列表中

def getArrayList(request):
    list_loop = [...set of values to loop through]

    store_array = [...store values here from for loop]

    for a in list_loop:
         val_db = SomeModel.objects.filter(somefield=a).first()
         result = perform calculation on val_db
         store_array.append(result)

如果有 10,000 个条目,则列表。如果用户想要这个请求,他已经准备好等待,并且会被告知这需要时间

我试过它joblibbacked=threading没有比普通循环节省太多时间

但是当我尝试使用backend=multiprocessing. 它说“应用程序尚未加载”

module我读过基于文件的多处理是不可能的。

所以我现在正在看celery。我不确定如何在芹菜中做到这一点。

任何人都可以指导我们如何使用可用的多重处理技术来加快 for 循环计算。

标签: django

解决方案


你可以试试concurrent.futures.ProcessPoolExecutor,这是一个处理cpu绑定任务的高级api

def perform_calculation(item):
    pass

# specify number of workers(default: number of processors on your machine)
with concurrent.futures.ProcessPoolExecutor(max_workers=6) as executor:
     res = executor.map(perform_calculation, tasks)

编辑

IO绑定操作的情况下,您可以利用ThreadPoolExecutor并行打开几个连接,您可以将池包装在一个contextmanager为您处理清理工作的池中(关闭空闲连接)。这是一个示例,但手动处理连接关闭。


推荐阅读