CodeGym /Kurslar /Python SELF AZ /GIL-in ətrafından keçmək

GIL-in ətrafından keçmək

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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))
1
Опрос
Asinxronluq,  26 уровень,  4 лекция
недоступен
Asinxronluq
Asinxronluq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION