Python dau­gia­pro­ce­si­nis ap­do­ro­ji­mas leidžia pa­skirs­ty­ti darbo krūvį tarp kelių procesų, taip su­trum­pi­nant bendrą vykdymo laiką. Tai ypač naudinga atliekant su­dė­tin­gus skai­čia­vi­mus ar tvarkant didelius duomenų rinkinius.

Kas yra Python dau­gia­pro­ce­si­nis ap­do­ro­ji­mas?

Dau­gia­pro­ce­si­nis ap­do­ro­ji­mas Python kalboje reiškia kelių procesų vykdymą vienu metu, lei­džian­tį mak­si­ma­liai išnaudoti dau­giabran­džių sistemų galimybes. Skir­tin­gai nuo vienos sriegės metodų, kurie užduotis atlieka po vieną, dau­gia­pro­ce­si­nis ap­do­ro­ji­mas leidžia įvairioms programos dalims veikti ly­gia­gre­čiai, kiek­vie­nai atskirai. Kiek­vie­nas procesas gauna savo atminties erdvę ir gali veikti at­ski­ruo­se pro­ce­so­riaus bran­duo­liuo­se, taip su­trum­pin­da­mas sudėtingų ar laiko atžvilgiu jautrių operacijų vykdymo laiką.

Python dau­gia­pro­ce­si­nis ap­do­ro­ji­mas turi platų taikymo spektrą. Dau­gia­pro­ce­si­nis ap­do­ro­ji­mas dažnai nau­do­ja­mas duomenų ap­do­ro­ji­mui ir analizei, siekiant greičiau apdoroti didelius duomenų rinkinius ir pa­grei­tin­ti su­dė­tin­gas analizes. Dau­gia­pro­ce­si­nis ap­do­ro­ji­mas taip pat gali būti nau­do­ja­mas si­mu­lia­ci­jo­se ir mo­de­lia­vi­mo skai­čia­vi­muo­se (pvz., mokslo srityje), siekiant su­trum­pin­ti sudėtingų skai­čia­vi­mų vykdymo laiką. Be to, kad jis padeda atlikti ži­nia­tink­lio duomenų rinkimą, vienu metu gaunant duomenis iš kelių svetainių, jis taip pat padidina vaizdų ap­do­ro­ji­mo ir kom­piu­te­ri­nio matymo efek­ty­vu­mą, todėl vaizdų analizė atliekama greičiau.

Kaip įgy­ven­din­ti Python dau­gia­pro­ce­si­nį ap­do­ro­ji­mą

Python siūlo įvairias dau­gia­pro­ce­si­nio ap­do­ro­ji­mo įgy­ven­di­ni­mo galimybes. Toliau pa­teik­si­me tris daž­niau­siai nau­do­ja­mas priemones: multiprocessing modulį, concurrent.futures bi­b­lio­te­ką ir joblib paketą.

multiprocessing modulis

multiprocessing modulis yra stan­dar­ti­nis Python dau­gia­pro­ce­si­nio ap­do­ro­ji­mo modulis. Naudodami šį modulį, galite kurti procesus, dalytis duo­me­ni­mis tarp jų ir sin­ch­ro­ni­zuo­ti juos naudodami užraktus, eiles ir kitas priemones.

import multiprocessing
def task(n):
    result = n * n
    print(f"Result: {result}")
if __name__ == "__main__":
    processes = []
    for i in range(1, 6):
        process = multiprocessing.Process(target=task, args=(i,))
        processes.append(process)
        process.start()
    for process in processes:
        process.join()
python

Pa­teik­ta­me pavyzdyje naudojame multiprocessing.Process klasę, kad sukurtume ir pa­leis­tu­me procesus, vyk­dan­čius task() funkciją, kuri ap­skai­čiuo­ja duoto skaičiaus kvadratą. Inicijavę procesus, pa­lau­kia­me, kol jie bus užbaigti, ir tik tada tęsiame pag­rin­di­nę programą. Re­zul­ta­tas rodomas naudojant f-string, Python stygos formato metodą, kuris įtraukia išraiškas. Verta paminėti, kad išvesties seka yra at­si­tik­ti­nė ir ne­de­ter­mi­nis­ti­nė. Taip pat galite sukurti procesų grupę su Python multiprocessing:

import multiprocessing
def task(n):
    return n * n
if __name__ == "__main__":
    with multiprocessing.Pool() as pool:
        results = pool.map(task, range(1, 6))
        print(results)  # Output: [1, 4, 9, 16, 25]
python

Su pool.map() funkcija task() taikoma duomenų sekai, o re­zul­ta­tai surenkami ir išvedami.

concurrent.futures bi­b­lio­te­ka

Šis modulis teikia aukšto lygio sąsają asin­ch­ro­ni­niam procesų vykdymui ir ly­gia­gre­čiam ap­do­ro­ji­mui. Jis naudoja „Pool Executor“ užduočių vykdymui procesų ar siūlų grupėje. concurrent.futures modulis yra pa­pras­tes­nis būdas apdoroti asin­ch­ro­ni­nes užduotis ir daugeliu atvejų yra lengviau valdomas nei Python multiprocessing modulis.

import concurrent.futures
def task(n):
    return n * n
with concurrent.futures.ProcessPoolExecutor() as executor:
    futures = [executor.submit(task, i) for i in range(1, 6)]
    for future in concurrent.futures.as_completed(futures):
        print(future.result()) # result in random order
python

Kodas naudoja concurrent.futures module, kad užduotis būtų ap­do­ro­ja­mos ly­gia­gre­čiai su ProcessPoolExecutor. Funkcija task(n) per­duo­da­ma skaičiams nuo 1 iki 5. as_completed() metodas laukia, kol užduotys bus užbaigtos, ir pateikia re­zul­ta­tus bet kokia tvarka.

joblib paketas

joblib yra išorinė Python bi­b­lio­te­ka, sukurta siekiant su­pa­pras­tin­ti ly­gia­gre­tų ap­do­ro­ji­mą Python kalboje, pa­vyz­džiui, kar­to­ja­moms užduotims, tokioms kaip funkcijų su skir­tin­gais įvesties pa­ra­met­rais vykdymas arba darbas su dideliais duomenų kiekiais. Pag­rin­di­nės joblib funkcijos yra užduočių ly­gia­gre­ti­ni­mas, funkcijų rezultatų tal­pi­ni­mas į talpyklą ir atminties bei skai­čia­vi­mo išteklių op­ti­mi­za­vi­mas.

from joblib import Parallel, delayed
def task(n):
    return n * n
results = Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11))
print(results) # Output: Results of the function for numbers from 1 to 10
python

Išraiška Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11)) ini­ci­juo­ja funkcijos task() ly­gia­gre­tų vykdymą skaičiams nuo 1 iki 10. Parallel yra su­kon­fi­gū­ruo­tas su n_jobs=4, o tai reiškia, kad gali būti ap­do­ro­ja­mi iki keturių ly­gia­gre­čių užduočių. Iš­šau­kiant delayed(task)(i) sukuriama užduotis, kuri turi būti vykdoma ly­gia­gre­čiai kiek­vie­nam skaičiui i intervale nuo 1 iki 10. Tai reiškia, kad funkcija task() yra iš­šau­kia­ma vienu metu kiek­vie­nam iš šių skaičių. Re­zul­ta­tai skaičiams nuo 1 iki 10 yra saugomi results ir išvedami.

Go to Main Menu