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]))
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.
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.