Pythoni mit­me­prot­ses­si­line tööt­le­mine võimaldab jagada töö­koor­muse mitme protsessi vahel, vä­hen­da­des sellega üldist täit­mis­aega. See on eriti kasulik kee­ru­liste arvutuste tegemisel või suurte and­me­ko­gu­mite tööt­le­misel.

Mis on Python mul­ti­proces­sing?

Mit­me­prot­ses­si­line tööt­le­mine Pythonis tähendab mitme protsessi sa­ma­aeg­set käi­vi­ta­mist, mis võimaldab mit­me­tuuma­lisi süsteeme mak­si­maal­selt ära kasutada. Erinevalt ühe­prot­ses­si­lis­test mee­to­di­test, mis töötlevad üles­an­deid ükshaaval, võimaldab mit­me­prot­ses­si­line tööt­le­mine programmi erinevaid osi pa­ral­leel­selt käivitada, igaüht eraldi. Iga protsess saab oma mäluruumi ja võib töötada eraldi prot­ses­so­ri­tuu­ma­del, mis vähendab oluliselt raske või aja­krii­ti­liste ope­rat­sioo­nide täitmise aega.

Python mul­ti­proces­singul on lai ra­ken­dus­vald­kond. Mul­ti­proces­singut ka­su­ta­takse sageli andmete tööt­le­misel ja ana­lüü­si­misel, et töödelda suuri and­me­ko­gu­meid kiiremini ja kii­ren­dada keerukaid analüüse. Mul­ti­prot­ses­si­mist saab kasutada ka si­mu­lat­sioo­ni­des ja mo­del­lee­ri­mise ar­vu­tus­tes (nt tea­dus­li­kes ra­ken­dus­tes), et lühendada kee­ru­liste arvutuste täitmise aega. Lisaks vee­bi­ko­gu­mise võimsuse suu­ren­da­misele, hankides andmeid mitmest saidist korraga, suurendab see ka pil­di­tööt­luse ja ar­vu­ti­nä­ge­mise efek­tiiv­sust, mis kiirendab pil­di­ana­lüüsi.

Kuidas rakendada Python mul­ti­proces­singut

Python pakub mitmeid võimalusi mit­me­prot­ses­si­lise tööt­le­mise ra­ken­da­miseks. Järg­mis­tes jaotistes tut­vus­tame teile kolme levinud vahendit: moodulit multiprocessing, raa­ma­tu­kogu concurrent.futures ja paketti joblib.

multiprocessing moodul

multiprocessing moodul on Python mul­ti­proces­singu stan­dard­moo­dul. Selle mooduli abil saate luua protsesse, jagada nende vahel andmeid ja neid lukkude, jär­je­kor­dade ja muude vahendite abil sünk­ro­ni­see­rida.

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

Eespool toodud näites kasutame klassi multiprocessing.Process prot­ses­side loomiseks ja käi­vi­ta­miseks, mis täidavad funkt­siooni task(), mis arvutab antud arvu ruudu. Pärast prot­ses­side al­ga­ta­mist ootame, kuni need lõpetavad töö, enne kui jätkame põ­hi­prog­ram­miga. Tulemus kuvatakse f-stringi abil, mis on Pythonis kasutatav stringi vor­min­gu­mee­tod, mis sisaldab väl­jen­deid. Tuleb märkida, et väljundi järjekord on juhuslik ja mit­te­de­ter­mi­nist­lik. multiprocessing 11-ga saab luua ka prot­ses­side kogu:

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

Funkt­sioon task() ra­ken­da­takse pool.map() andmete jada suhtes ning tulemused kogutakse ja väl­jas­ta­takse.

concurrent.futures raa­ma­tu­kogu

See moodul pakub kõr­ge­ta­se­me­list liidest prot­ses­side asünk­roon­seks täit­miseks ja pa­ral­leel­seks tööt­le­miseks. See kasutab Pool Execu­to­rit üles­an­nete täit­miseks prot­ses­side või niitide kogumis. Moodul concurrent.futures on lihtsam viis asünk­roon­sete üles­an­nete tööt­le­miseks ja on paljudel juhtudel lihtsam käsitseda kui moodul Python multiprocessing.

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

Kood kasutab concurrent.futures module, et töödelda üles­an­deid pa­ral­leel­selt ProcessPoolExecutor. Funkt­sioon task(n) edas­ta­takse numb­ri­tele 1 kuni 5. Meetod as_completed() ootab üles­an­nete lõ­pe­ta­mist ja väljastab tulemused mis tahes jär­je­kor­ras.

joblib pakett

joblib on väliseks Python-teegiks, mis on loodud Pythonis pa­ral­leelse tööt­le­mise liht­sus­ta­miseks, näiteks korduvate üles­an­nete jaoks, nagu erinevate si­send­pa­ra­meet­ri­tega funkt­sioo­nide täitmine või suurte and­me­hul­kade tööt­le­mine. joblib peamised funkt­sioo­nid on üles­an­nete pa­ral­leel­sus, funkt­sioo­nide tulemuste vahemällu sal­ves­ta­mine ning mälu ja ar­vu­tus­res­surs­side op­ti­mee­ri­mine.

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

Väljend Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11)) käivitab funkt­siooni task() pa­ral­leelse täitmise numb­ri­tele 1 kuni 10. Parallel on kon­fi­gu­ree­ri­tud koos n_jobs=4, mis tähendab, et tööd saab töödelda kuni neljas pa­ral­leel­ses režiimis. Kõne delayed(task)(i) loob ülesande, mis tuleb täita pa­ral­leel­selt iga numbri i jaoks vahemikus 1 kuni 10. See tähendab, et funkt­siooni task() kut­su­takse sa­ma­aeg­selt igaühe jaoks neist numb­ri­test. Numb­ri­tele 1 kuni 10 vastavad tulemused sal­ves­ta­takse results ja väl­jas­ta­takse.

Go to Main Menu