11.1 Global Interpreter Lock
Global Interpreter Lock (GIL)
— CPython interpretatorunda olan bir mexanizmdir ki, eyni zamanda yalnız bir thread-in Python byte-code icra etməsini təmin edir. GIL
paralel thread icrasını məhdudlaşdırır, bu da çox nüvəli prosessorlarda çoxthreadli proqramların performansına mənfi təsir göstərə bilər.
GIL
-in mövcud olmasının səbəbləri
Yaddaşın idarə edilməsinin sadələşdirilməsi: GIL
yaddaş idarəçiliyini və zibil toplama prosesini sadələşdirir, Python-u həyata keçirmək üçün daha asan edir.
Thread təhlükəsizliyi: GIL
racing vəziyyətlərinin qarşısını alır, beləliklə, blokları istifadə etmək zərurəti olmadan kodun icrasını thread təhlükəsiz edir.
GIL
-in yaratdığı problemlər
Məhdud performans: Hesablama baxımından intensiv olan tapşırıqları həyata keçirən çoxthreadli proqramlar, GIL
məhdudiyyətlərinə görə çox nüvəli prosessorların üstünlüklərini tam istifadə edə bilmir.
Performansın təhrif olunması: Tapşırıqları yerinə yetirmək üçün thread-ləri intensiv istifadə edən proqramlar, thread-lər arasında kontekst dəyişikliklərindən dolayı performansın azalması ilə üzləşə bilər.
Hal-hazırda, GIL-i «yan keçmək» üçün 4 əsas üsul mövcuddur:
11.2 Çox prosesliliyin istifadəsi (multiprocessing)
multiprocessing
modulu paralel şəkildə icra olunan və GIL
ilə məhdudlaşdırılmayan proseslər yaratmağa imkan verir, çünki hər bir prosesin öz Python interpretatori və yaddaşı var.
Nümunə:
import multiprocessing
def worker(num):
print(f'İşçi: {num}')
def main():
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
main()
11.3 Asinxron proqramlaşdırma
asyncio
-dan istifadə edərək asinxron proqramlaşdırma, əsas thread-i bloklamadan, tapşırıqları paralel şəkildə icra etməyə imkan verir. Bu, birbaşa mənada GIL
-i keçməsə də, gözləmə vaxtını effektiv şəkildə digər tapşırıqların icrası üçün istifadə etməyə imkan verir.
Nümunə:
import asyncio
async def main():
await asyncio.sleep(1)
print('Salam')
asyncio.run(main())
11.4 Öz axını idarə edən kitabxanalardan istifadə
NumPy və SciPy kimi bəzi kitabxanalar C dilində yazılıb və öz axın idarəetmə mexanizmlərindən istifadə edir ki, bu da onlara GIL-in ətrafından keçməyə və çoxnüvəli prosessorları hesablamalar üçün effektiv şəkildə istifadə etməyə imkan verir.
Əslində, bu Python-un uğurunun əsas səbəblərindən biridir, nə qədər yavaş olsa da. Bütün mürəkkəb hesablamalar C/C++ dillərində yenidən yazılıb və bütün prosessor nüvələrində və ya hətta dərhal videokartın nüvələrində icra olunur. Müasir videokartlarda minlərlə nüvə var.
Belə çıxır ki, artıq dilin nə qədər sürətli və ya yavaş olması vacib deyil, əgər bütün resurs tələb edən hesablamalar xarici kitabxanalar vasitəsilə həyata keçirilirsə və ya tamamilə uzaq data-mərkəzlərə yönəldilirsə.
11.5 Python interpretatorundan kənar hesablamaların yerinə yetirilməsi
C/C++ və ya digər dillərdə yazılmış genişləndirmələrdən istifadə, hansı ki, Python interpretatorundan kənar hesablamalar yerinə yetirə bilər və nəticəni geri qaytara bilər. Bu, intensiv hesablamaların icrası zamanı GIL blokadasından qaçmağa imkan verir.
Cython istifadəsinə nümunə:
# example.pyx
def compute(int n):
cdef int i, result = 0
for i in range(n):
result += i
return result
Kompilyasiya və istifadə:
cythonize -i example.pyx
import example
print(example.compute(1000000))
GO TO FULL VERSION