django和Python代码中的多处理



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

场景是:在GUI中,当我点击";运行";按钮控件属于python函数(它不是主函数(。

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

但由于multiprocessing.process((需要__name__ ='__main__',我在";CCD_ 2";in multiprocessing((没有被调用。

我怎样才能做到这一点。如果多处理似乎是错误的方式,那么有什么其他方法可以提高代码性能呢?

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

urls.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()

这太长了,无法在注释中指定,所以:

再说一遍,我对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*以获得您的一个*celeb*的性能,但不会阻止表示性能。

直到工人没有空闲,任务才会执行,因此进程的数量应该不会有问题。

相关内容

  • 没有找到相关文章

最新更新