Python mul­ti­pro­ces­sing låter dig dela upp ar­bets­be­last­ning­en mellan flera processer, vilket minskar den totala ex­e­kve­rings­ti­den. Detta är särskilt an­vänd­bart för att göra tunga be­räk­ning­ar eller hantera stora da­ta­mäng­der.

Vad är Python-mul­ti­pro­ces­sing?

Mul­ti­pro­ces­sing i Python innebär att flera processer körs samtidigt, vilket gör att du kan utnyttja multicore-system maximalt. Till skillnad från en­kel­sträng­a­de metoder som hanterar uppgifter en efter en, låter mul­ti­pro­ces­sing olika delar av pro­gram­met köras pa­ral­lellt, var och en för sig. Varje process får sitt eget min­nesut­rym­me och kan köras på separata pro­ces­sor­kär­nor, vilket minskar ex­e­kve­rings­ti­den för tunga eller tids­käns­li­ga ope­ra­tio­ner.

Python-mul­ti­pro­ces­sing har ett brett spektrum av tillämp­ning­ar. Mul­ti­pro­ces­sing används ofta inom da­ta­be­hand­ling och analys för att bearbeta stora da­ta­mäng­der snabbare och påskynda komplexa analyser. Mul­ti­pro­ces­sing kan också användas i si­mu­le­ring­ar och mo­dell­be­räk­ning­ar (t.ex. i ve­ten­skap­li­ga tillämp­ning­ar) för att förkorta ex­e­kve­rings­ti­der­na för komplexa be­räk­ning­ar. Förutom att driva webb­skrap­ning genom att hämta data från flera webb­plat­ser samtidigt, ökar det också ef­fek­ti­vi­te­ten i bild­be­hand­ling och da­tor­se­en­de, vilket re­sul­te­rar i snabbare bilda­na­lys.

Hur man im­ple­men­te­rar Python-mul­ti­pro­ces­sing

Python erbjuder olika al­ter­na­tiv för att im­ple­men­te­ra mul­ti­pro­ces­sing. I följande avsnitt pre­sen­te­rar vi tre vanliga verktyg: modulen multiprocessing, bib­li­o­te­ket concurrent.futures och paketet joblib.

multiprocessing moduler

Modul multiprocessing är stan­dard­mo­du­len för mul­ti­pro­ces­sing i Python. Med denna modul kan du skapa processer, dela data mellan dem och syn­kro­ni­se­ra dem med hjälp av lås, köer och andra verktyg.

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

I exemplet ovan använder vi klassen multiprocessing.Process för att skapa och köra processer som exekverar funk­tio­nen task(), som beräknar kvadraten på ett givet tal. Efter att ha ini­ti­a­li­se­rat pro­ces­ser­na väntar vi på att de ska slutföras innan vi fort­sät­ter med hu­vud­pro­gram­met. Re­sul­ta­tet visas med hjälp av en f-sträng, en Python-sträng­for­mat­me­tod som in­ne­hål­ler uttryck. Det är värt att notera att ut­da­ta­se­kven­sen är slump­mäs­sig och icke-de­ter­mi­nis­tisk. Du kan också skapa en pro­ces­spool med 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

Med pool.map() tillämpas funk­tio­nen task() på en sekvens av data, och re­sul­ta­ten samlas in och matas ut.

concurrent.futures bibliotek

Denna modul till­han­da­hål­ler ett högni­vå­gräns­snitt för asynkron ex­e­kve­ring och parallell be­ar­bet­ning av processer. Den använder Pool Executor för att exekvera uppgifter på en pool av processer eller trådar. Modulen concurrent.futures är ett enklare sätt att bearbeta asynkrona uppgifter och är i många fall lättare att hantera än Python-modulen 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

Koden använder concurrent.futures module för att bearbeta uppgifter pa­ral­lellt med ProcessPoolExecutor. Funk­tio­nen task(n) skickas för siffrorna 1 till 5. Metoden as_completed() väntar på att upp­gif­ter­na ska slutföras och visar re­sul­ta­ten i valfri ordning.

joblib paket

joblib är ett externt Python-bibliotek som är utformat för att förenkla pa­ral­lell­be­ar­bet­ning i Python, till exempel för re­pe­ter­ba­ra uppgifter som att exekvera funk­tio­ner med olika in­pa­ra­met­rar eller arbeta med stora da­ta­mäng­der. De vik­ti­gas­te funk­tio­ner­na i joblib är pa­ral­lel­li­se­ring av uppgifter, cache­lag­ring av funk­tions­re­sul­tat och op­ti­me­ring av minnes- och be­räk­nings­re­sur­ser.

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

Uttrycket Parallel(n_jobs=4)(delayed(task)(i) for i in range(1, 11)) initierar pa­ral­lell­kör­ning av funk­tio­nen task() för siffrorna 1 till 10. Parallel är kon­fi­gu­re­rat med n_jobs=4, vilket innebär att upp till fyra pa­ral­lel­la jobb kan bearbetas. Anropet delayed(task)(i) skapar uppgiften som ska köras pa­ral­lellt för varje siffra i i in­ter­val­let 1 till 10. Detta innebär att funk­tio­nen task() anropas samtidigt för var och en av dessa siffror. Re­sul­ta­ten för siffrorna 1 till 10 lagras i results och matas ut.

Gå till huvudmeny