Параллелдик: Көп процесстүүлүк
Чыныгы өзүнчө Python процесстерин иштетип, процессордун бардык ядролорун колдонуңуз
multiprocessing модулу кодуңузду операциялык системанын өзүнчө процесстеринде иштетет; алардын ар биринин өзүнчө Python интерпретатору жана өзүнчө глобалдык интерпретатор кулпусу (GIL) бар. Бул CPU-bound (эсептөөгө оор) Python кодун бир эле убакта көп ядрого иштетүүнүн бирден-бир ишенимдүү жолу. Анын баасы — процесстер эстутумду бөлүшпөгөндүктөн, ар бир аргумент жана ар бир натыйжа сериализацияланып (pickle) процесстин чегинен өткөрүлүшү керек.
- эсептөө иши үчүн GIL эмне үчүн процесстерди (агымдарды эмес) колдонууга мажбурлаарын түшүндүрө аласыз,
- иштерди
Process,PoolжанаProcessPoolExecutorаркылуу баштай аласыз, map,imapжанаapply_asyncортосунан тандап, ылайыктууchunksizeтандай аласыз,- маалыматты
Queue,Pipeжанаshared_memoryменен жылдыра аласыз, - классикалык тузактардан качасыз:
if __name__ == "__main__"коргоосу, сериализацияланбас аргументтер жана баштоо методдору (spawnжанаfork).
1. GIL жана эмне үчүн агымдар эсептөөгө жардам бербейт
CPython өзүнүн ички абалын глобалдык интерпретатор кулпусу (GIL) менен коргойт: каалаган учурда Python байт-кодун бир гана агым аткара алат. I/O-bound иш үчүн (тармакты, дискти же маалымат базасын күтүү) агымдар эң сонун, анткени агым күткөндө GIL бошотулат. Бирок CPU-bound иш үчүн (эсептөө, талдоо, кысуу, сүрөт иштетүү) агымдар бир ядрого кезектешип, эч кандай ылдамдоо бербейт.
Көп процесстүүлүк GIL'ди толугу менен айланып өтөт. Ар бир бала процесс — өзүнүн GIL'и бар өзүнчө Python интерпретатору, ошондуктан N процесс чындап эле Python байт-кодун N ядрого бир убакта аткара алат.
| Иштин түрү | Мыкты курал | Эмне үчүн |
|---|---|---|
| I/O-bound (сурамдар, файлдар, БД) | threading / asyncio | күткөндө GIL бошотулат; кошумча процесстер керек эмес |
| CPU-bound (математика, талдоо, кодтоо) | multiprocessing | жалгыз GIL тоскоолдугун өзүнчө процесстер гана айланып өтөт |
Эреже: код эсептөө менен алек болсо — процесстерди алыңыз. Күтүү менен алек болсо — агымдарды же async'ти алыңыз.