ProgramlamaBackend Geliştirici

Python'da iş parçacıkları ile çalışma modelini açıklayın. GIL nedir ve eşzamanlılığı nasıl etkiler? Python'da eşzamanlı hesaplama görevlerini nasıl çözersiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Python'da standart kütüphane, çok iş parçacıklı programlama için threading modülünü sağlar. İş parçacıkları, bir süreç içinde birden fazla işlemi eşzamanlı olarak gerçekleştirmeye olanak tanır. Ancak Python'un standart uygulaması (CPython) içinde GIL (Global Interpreter Lock) adlı bir mekanizma bulunmaktadır; bu, Python byte kodunu yalnızca bir iş parçacığının aynı anda çalıştırmasına izin veren bir küresel kilit anlamına gelir.

Bu, CPython'da çok iş parçacıklı programlamanın, Python kodunu CPU düzeyinde gerçek eşzamanlılık sağlamadığını gösterir; eşzamanlılık, yalnızca bekleme (I/O-bound) ile ilgili görevler için yararlıdır. CPU-bound görevler için multiprocessing modülünü kullanmanız önerilir; bu modül birden fazla süreci başlatarak GIL'i aşar.

Örnek:

import threading def worker(): print('Başlangıç') # ağır hesaplamalar print('Bitiş') threads = [threading.Thread(target=worker) for _ in range(5)] for t in threads: t.start() for t in threads: t.join()

Yoğun hesaplamalar için eşzamanlılık sağlamak üzere multiprocessing kullanın:

from multiprocessing import Pool def square(x): return x*x with Pool(4) as p: print(p.map(square, [1, 2, 3, 4]))

Kandırmacalı soru.

Python'da çok iş parçacıklılık, hesaplama yoğun görevleri hızlandırabilir mi?

Cevap: Hayır, GIL nedeniyle Python'un standart uygulamasında (CPython) iş parçacıkları, CPU-bound görevlerinde performans artışı sağlamaz; bu tür görevler için multiprocessing veya GIL olmayan üçüncü taraf yorumlayıcıları (örneğin, Jython, IronPython) kullanın.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

Büyük miktarda veriyi işleme projesinde ekip, hesaplamaları iş parçacıkları (threading) ile hızlandırmaya çalıştı. Hız artışı yerine çalışma süresi uzadı, çünkü GIL iş parçacıklarının eşzamanlı çalışmasına izin vermedi; multiprocessing'e geçtikten sonra görev çözüldü.


Hikaye

Bir geliştirici büyük dosyaları eş zamanlı olarak indirmeye ve işlemeye çalıştı, ancak sık sık kesintiye uğradı; çünkü paylaşılan değişkenleri dikkatli kullanmadan kilitlemeden (iş parçacığı güvenliği) dolayı "deadlock" ile karşılaştı.


Hikaye

Backend sunucusunda ağır istekleri işlemek için bir iş parçacığı havuzu uygulandı. Yük arttıkça sunucu "donmaya" başladı — çoğu zaman, iş parçacıkları GIL nedeniyle Python kodunu yürütmek için beklemekteydi, oysa istekler yoğun I/O ile ilgili değildi.