django和Python代码中的多处理
我正在尝试在windows系统上的应用程序中实现多处理 情况是: 在GUI中,当我单击“Run”按钮时,控制会转到python函数(它不是主函数) 现在,在这个函数中,我运行循环并一次读取/执行多个文件。我希望这一切同时发生 但由于multiprocessing.process()需要django和Python代码中的多处理,python,multithreading,optimization,parallel-processing,multiprocessing,Python,Multithreading,Optimization,Parallel Processing,Multiprocessing,我正在尝试在windows系统上的应用程序中实现多处理 情况是: 在GUI中,当我单击“Run”按钮时,控制会转到python函数(它不是主函数) 现在,在这个函数中,我运行循环并一次读取/执行多个文件。我希望这一切同时发生 但由于multiprocessing.process()需要\uuuuu name\uuuu='\uuuu main\uuuuu',因此在multiprocessing()中的“target=function name”中提到的我的函数未被调用 我怎样才能做到。如果多处理似
\uuuuu name\uuuu='\uuuu main\uuuuu'
,因此在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()
特别是,任务运行程序可以使用 通过芹菜,可以创建“任务轮换”: 我的任务.py my_views.py 调用.delay将注册*myJob*以获得您的*芹菜*,但不会阻止表示性能
在工作人员没有空闲之前,任务不会执行,因此您应该对进程数没有问题。这太长,无法在注释中指定,因此: 同样,我在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
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
这使用了多处理
模块:
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
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
现在你只要试试看。也许a能满足你的需要,幸运的是@JPery不能。池也需要从“main”调用。
如果只有在Windows平台上才需要uuuu name_uuu='\uuuuuuu main_uuu'
。我想这就是你的情况,不过查一查也无妨,对吧?我对Django不太熟悉,但我知道一点。在Windows中,如果我在处理URL的函数中创建一个进程或池,即使包含文件中的所有代码都复制到子进程中并从文件顶部开始执行,该函数也不会重新执行,也不会出现问题。如果您指定您的环境和一个可重复性最低的示例,可能会有所帮助。@Booboo,添加了高级代码流。请查看并提出建议。这不是主要功能,因此您的代码将被忽略。您完全正确!任务运行程序可以使用,尤其是芹菜。