簡體   English   中英

django和Python代碼中的多處理

[英]Multiprocessing in django and Python code

我正在嘗試在 windows 系統上的應用程序中實現多處理。

場景是:從 GUI 中,當我單擊“運行”按鈕時,控件會出現 python 函數(這不是主要函數)。

現在在這個 function 中,我正在運行循環並一次讀取/執行多個文件。 我希望這同時發生。

但是由於 multiprocessing.process() 需要__name__ ='__main__' ,我的 function 在 multiprocessing() 的“ target = function name ”中提到的沒有被調用。

我怎樣才能讓它發生。 如果 multiprocessing 似乎是錯誤的方式,那么還有其他方法可以提高代碼性能嗎?

添加示例代碼(請注意,這只是一個偽代碼,我在其中添加了高級代碼以理解流程,請原諒任何語法錯誤):

urls.py 文件:

from django.urls import path
from textapp import views

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

意見.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()

Task runner 可以使用,特別是Celery

通過 Celery 可以創建“任務輪”:

我的任務.py

from celery import task

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

我的觀點.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 * 以供您的一個 * celery * 執行,但不會阻止表示執行。

直到工作人員沒有空閑時才會執行任務,因此您應該不會遇到進程數問題。

這太長了,無法在評論中指定,因此:

同樣,我沒有 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

現在你只需要嘗試看看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM