1. Sissejuhatus
Python on mitmekülgne programmeerimiskeel, mis pakub eriti võimsaid tööriistu andmetöötluse, masinõppe ja veebiarenduse valdkonnas. Nende seas on multiprocessing moodul oluline teek paralleeltöötluse realiseerimiseks. Selles artiklis selgitame detailselt Python’i multiprocessing mooduli põhilist kasutust kuni praktiliste rakendusteni, visuaalsete lisadega, ning tutvustame tehnikaid, kuidas maksimeerida jõudlust.
2. Mis on multiprocessing?
2.1 Paralleeltöötluse vajadus
Python töötab vaikimisi ühes lõimes, kuid suurte andmemahtude või raske töötluse korral on sellel meetodil kiirusel piirangud. Paralleeltöötluse abil saab käivitada mitu ülesannet samaaegselt, kasutada kõiki CPU südamikke ja lühendada töötlemisaega. multiprocessing moodul väldib Python’i GIL-i (Global Interpreter Lock) ning võimaldab tõelist paralleeltöötlust, kasutades mitut protsessi.
2.2 Erinevus ühe lõimega töötlemisest
Ühelõimelises režiimis täidab üks protsess ülesandeid järjest, samas kui mitmeprotsessiline töötlemine võimaldab mitmel protsessil paralleelselt ülesandeid lahendada. See parandab jõudlust eriti CPU-mahuka töö puhul (nt ulatuslikud arvutused või andmeanalüüs).
3. multiprocessing mooduli põhistruktuur
3.1 Process klassi kasutamine
multiprocessing
mooduli aluseks on Process klass. Selle abil saab lihtsalt luua uusi protsesse ja täita paralleeltöötlust.
import multiprocessing
def worker_function():
print("Uus protsess on käivitatud")
if __name__ == "__main__":
process = multiprocessing.Process(target=worker_function)
process.start()
process.join()
Selles näites käivitatakse worker_function
uues protsessis. start()
käivitab protsessi ja join()
ootab, kuni protsess lõpetab.
3.2 Argumentide edastamine protsessile
Protsessile argumentide edastamiseks kasutatakse args
parameetrit. Järgmises näites antakse worker
funktsioonile argument:
def worker(number):
print(f'Worker {number} käivitati')
if __name__ == "__main__":
process = multiprocessing.Process(target=worker, args=(5,))
process.start()
process.join()
Nii saab protsessile dünaamiliselt andmeid edastada ja neid paralleelselt töödelda.
4. Andmete jagamine ja sünkroonimine
4.1 Jagatud mälu kasutamine
Mitme protsessi vahel andmete ohutuks jagamiseks kasutatakse Value ja Array objekte. Need võimaldavad mitmel protsessil samaaegselt andmeid töödelda ilma konfliktideta.
import multiprocessing
def increment_value(shared_value):
with shared_value.get_lock():
shared_value.value += 1
if __name__ == "__main__":
shared_value = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment_value, args=(shared_value,)) for _ in range(5)]
for process in processes:
process.start()
for process in processes:
process.join()
print(f'Lõplik väärtus: {shared_value.value}')
Ülaltoodud koodis suurendavad viis protsessi samaaegselt jagatud mälu väärtust. get_lock()
väldib konfliktid.
4.2 Lukkude kasutamine andmekonfliktide vältimiseks
Kui mitu protsessi töötleb samaaegselt samu andmeid, kasutatakse lukustusmehhanisme konfliktide vältimiseks. Lock
objekt tagab protsesside sünkroniseerimise.

5. Ülesannete jaotamine protsessipooli abil
5.1 Pool klassi kasutamine
Pool
klass võimaldab jaotada ülesandeid mitme protsessi vahel ja käivitada need paralleelselt. See on kasulik suurte andmemahtude töötlemisel.
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.map(square, range(10))
print(results)
Selles näites arvutatakse listi elementide ruut ja jaotatakse need nelja protsessi vahel.
Diagramm: Pool klassi ülesannete jaotus

5.2 Edasijõudnud kasutus: starmap
starmap()
võimaldab töödelda funktsioone, millel on mitu argumenti:
def multiply(x, y):
return x * y
if __name__ == "__main__":
with Pool(4) as pool:
results = pool.starmap(multiply, [(1, 2), (3, 4), (5, 6), (7, 8)])
print(results)
6. CPU ressursside optimaalne kasutamine
6.1 cpu_count()
protsesside optimeerimiseks
Python’i multiprocessing.cpu_count()
võimaldab automaatselt määrata süsteemi südamike arvu ja seadistada protsesside hulga vastavalt sellele.
from multiprocessing import Pool, cpu_count
if __name__ == "__main__":
with Pool(cpu_count() - 1) as pool:
results = pool.map(square, range(100))
print(results)
6.2 Süsteemi ressursside efektiivne kasutus
Kõiki CPU südamikke ei soovitata täielikult kasutada – üks tuleks jätta süsteemi jaoks, et vältida ülekoormust.
7. Reaalsed kasutusjuhtumid ja parimad praktikad
7.1 Näited kasutusest
Multiprocessing on kasulik järgmistel juhtudel:
- Suurte andmete töötlemine: mitme faili samaaegne lugemine ja töötlemine.
- Masinõppe treening: mudelite paralleelne treenimine ajasäästlikult.
- Veebikraapimine: mitme lehe samaaegne töötlemine.
7.2 Parimad praktikad
- Ressursside optimaalne jaotus: seadista protsesside arv vastavalt füüsilistele südamikele.
- Debugimine ja logimine: kasuta
logging
moodulit protsesside jälgimiseks ja vigade käsitlemiseks.
import logging
import multiprocessing
def worker_function():
logging.info(f'Protsess {multiprocessing.current_process().name} käivitati')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
process = multiprocessing.Process(target=worker_function, name='Worker1')
process.start()
process.join()
- Vigade käsitlemine: mitmeprotsessilises keskkonnas on oluline vältida, et ühe protsessi viga mõjutaks teisi.

8. Kokkuvõte
Selles artiklis vaatasime, kuidas Python’i multiprocessing mooduliga saavutada efektiivne paralleeltöötlus. Tutvustasime Process klassi põhikasutust, andmete jagamist, protsessipooli ning reaalseid kasutusjuhtumeid.
Paralleeltöötluse õige rakendamine võimaldab maksimeerida jõudlust suurte andmemahtude, masinõppe treeningute ja veebikraapimise projektides. Multiprocessing moodul aitab tõsta Python’i töötlusvõimet ja kasutada süsteemi ressursse efektiivselt.
Soovitame katsetada ja rakendada multiprocessing tehnikaid oma igapäevases arendustöös.