Django和Python代码中的多处理

2024-06-16 08:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在windows系统上的应用程序中实现多处理

情况是: 在GUI中,当我单击“Run”按钮时,控制会转到python函数(它不是主函数)

现在,在这个函数中,我运行循环并一次读取/执行多个文件。我希望这一切同时发生

但是由于multiprocessing.process()需要__name__ ='__main__',因此没有调用multiprocessing()中“target = function name”中提到的函数

我怎样才能做到。如果多处理似乎是错误的方式,那么有没有其他方法来提高代码性能

添加示例代码(请注意,这只是一个psudo代码,我添加了高级代码来理解流程,请原谅任何语法错误):

URL.py文件:

from django.urls import path
from textapp import views

urlpatterns = [
    path('execute/',views.functiontomultiprocess),
    ...
    other urls
    ]

views.py:

def functiontomultiprocess(request):
nprocess = []
for doc in alldocs:
   p = multiprocess.Process(function2)
   p.start() # start process
   nprocess.append(p) 

 for  p1 in nprocess:
   p1.join()

Tags: 文件path函数代码namefrompyimport
2条回答

这太长,无法在注释中指定,因此:

同样,我在Django方面没有专业知识,但我认为这不会在Windows或Linux/Unix上造成问题。但是,您没有指定所请求的平台但是,此外,您提供的代码完成的很少,因为您的循环创建了一个进程,并在创建下一个进程之前等待它完成。最终,一次运行的进程不会超过一个,因此没有并行性。要更正此问题,请尝试以下操作:

def functiontomultiprocess(request):
    processes = []
    for doc in alldocs: # where is alldocs defined?
        p = multiprocess.Process(function2, args=(doc,)) # pass doc to function2
        processess.append(p)
        p.start()
    # now wait for the processes to complete
    for p in processes:
        p.join()

或者,如果你想使用游泳池,你可以选择。这将使用concurrent.futures模块:

import concurrent.futures

def functiontomultiprocess(request):
    """
    Does it make sense to create more processes than CPUs you have?
    It might if there is a lot of I/O. In which case try:
    n_processes = len(alldocs)
    """
    n_processes = min(len(alldocs), multiprocessing.cpu_count())
    with concurrent.futures.ProcessPoolExecutor(max_workers=n_processes) as executor:
        futures = [executor.submit(function2, doc) for doc in alldocs] # create sub-processes
        return_values = [future.result() for future in futures] # get return values from function2

这将使用multiprocessing模块:

import multiprocessing

def functiontomultiprocess(request):
    n_processes = min(len(alldocs), multiprocessing.cpu_count())
    with multiprocessing.Pool(processes=n_processes) as pool:
        results = [pool.apply_async(function2, (doc,)) for doc in alldocs] # create sub-processes
        return_values = [result.get() for result in results] # get return values from function2

现在您只需试试看。

任务运行程序可以使用,特别是Celery

通过芹菜,可以创建“任务轮换”:

my_task.py

from celery import task

@task
def myJob(*args,**kwargs):
    # main task
    # . . .

my_views.py

from django.shortcuts import render_to_response as rtr

from .tasks import myJob

def view(request):
    # view
    # . . .
    myJob.delay(*args,**kwargs)
    return rtr('template.html', {'message': 'Job has been entered'})

调用.delay将注册*myJob*以获得您的*芹菜*,但不会阻止表示性能

直到工作人员没有空闲,任务才会执行,因此您应该不会遇到进程数量方面的问题

相关问题 更多 >