İş Parçacıkları ve GIL
Python iş parçacığı kullanımının sınırlarını anlayın
İş Parçacıkları ve GIL, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
Thread Nedir
İş parçacığı, tek bir işlem içindeki ayrı bir yürütme akışıdır. Python'un threading modülü, tek bir program içinde işlevleri eşzamanlı olarak çalıştırmanızı sağlar.
import threading
def worker():
print('hello from thread')
t = threading.Thread(target=worker)
t.start()
t.join()
print('main done')Birden Çok İş Parçacığı Başlatma
Birden çok iş parçacığı başlatabilirsiniz. Her biri kendi hedef işlevini çalıştırır. join(), ana iş parçacığının bir iş parçacığı tamamlanana kadar beklemesini sağlar.
import threading
def task(name):
print('task', name)
threads = [threading.Thread(target=task, args=(i,)) for i in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
print('all finished')Genel Yorumlayıcı Kilidi
CPython'da bir Genel Yorumlayıcı Kilidi (GIL) bulunur: Python bayt kodunu aynı anda yalnızca bir iş parçacığı yürütür. Bu nedenle iş parçacıkları yalnızca Python koduyla yapılan CPU ağırlıklı işlerde gerçek bir paralel hızlanma sağlamaz.
import sys
print('Running on:', sys.implementation.name)
print('Only one thread runs Python bytecode at a time due to the GIL')İş Parçacıkları Ne Zaman Yardımcı Olur
İş parçacıkları G/Ç ağırlıklı işlerde etkilidir: ağ istekleri, disk okumaları ve bekleme. Bir iş parçacığı beklerken GIL serbest bırakılır ve başka bir iş parçacığı çalışabilir.
import threading, time
def fake_io(name):
time.sleep(0.1)
print('done', name)
start = time.perf_counter()
ts = [threading.Thread(target=fake_io, args=(i,)) for i in range(3)]
for t in ts: t.start()
for t in ts: t.join()
print('elapsed about 0.1s, not 0.3s')CPU Ağırlıklı İşler Hızlanmaz
Ağır hesaplamalarda iş parçacığı eklemek işlemi hızlandırmaz; çünkü GIL bunları sıraya koyar. CPU işleri için bunun yerine multiprocessing kullanın.
import threading
def burn():
total = 0
for i in range(1000000):
total += i
return total
t = threading.Thread(target=burn)
t.start()
t.join()
print('CPU-bound: threads share one core under the GIL')Daemon İş Parçacıkları
Daemon iş parçacığı, ana program sona erdiğinde otomatik olarak sonlandırılır. Beklemeniz gerekmeyen background yardımcıları için kullanın.
import threading, time
def background():
time.sleep(0.05)
print('background tick')
t = threading.Thread(target=background, daemon=True)
t.start()
t.join()
print('main exits')İş Parçacıklarını Adlandırma ve Tanımlama
Her iş parçacığının bir adı ve kimliği vardır. threading.current_thread(), günlükleme için kullanışlı olan çalışan iş parçacığı nesnesini döndürür.
import threading
def show():
t = threading.current_thread()
print('running in', t.name)
t = threading.Thread(target=show, name='Worker-1')
t.start()
t.join()
print('main thread:', threading.current_thread().name)Thread'den Türetme
Bir hedef geçirmek yerine Thread sınıfından türetebilir ve run() yöntemini geçersiz kılabilirsiniz. Bu, bir iş parçacığının kendine ait bir duruma ihtiyaç duyduğu durumlarda kullanışlıdır.
import threading
class Greeter(threading.Thread):
def __init__(self, name):
super().__init__()
self.who = name
def run(self):
print('hi', self.who)
g = Greeter('Sam')
g.start()
g.join()İş Parçacıklarından Sonuç Döndürme
Hedef işlevin dönüş değeri yok sayılır. Sonuçları toplamak için bunları paylaşılan bir yapıya yazın (ileride kuyruklar gibi daha güvenli araçları göreceksiniz).
import threading
results = {}
def compute(key):
results[key] = key * key
ts = [threading.Thread(target=compute, args=(i,)) for i in range(4)]
for t in ts: t.start()
for t in ts: t.join()
print(results)Etkin İş Parçacıklarını Sayma
threading.active_count(), ana iş parçacığı da dâhil olmak üzere o anda canlı olan iş parçacıklarının sayısını bildirir.
import threading, time
def wait():
time.sleep(0.05)
ts = [threading.Thread(target=wait) for _ in range(2)]
for t in ts: t.start()
print('active now:', threading.active_count())
for t in ts: t.join()
print('active after join:', threading.active_count())İş Parçacıkları mı, İşlemler mi
Genel kural: G/Ç ağırlıklı eşzamanlılık için iş parçacıklarını, CPU ağırlıklı paralellik için işlemleri kullanın. Bunun nedeni GIL'dir.
tasks = {'download files': 'threads', 'crunch numbers': 'processes', 'call APIs': 'threads'}
for task, choice in tasks.items():
print(task, '->', choice)Hızlı Kontrol
İş parçacıklarını ve GIL'i anlayıp anlamadığınızı sınayın.
Özet
İş parçacıkları ve GIL hakkında bilgi edindiniz:
- İş parçacıkları bir işlem içinde
threading.Threadaracılığıyla eşzamanlı çalışır. - GIL, Python bayt kodunun yürütülmesini sıraya koyar.
- İş parçacıkları G/Ç ağırlıklı işlere, işlemler ise CPU ağırlıklı işlere yardımcı olur.
start(),join(), daemon iş parçacıklarını ve sınıftan türetmeyi kullanın.
Sırada, iş parçacıklarını ThreadPoolExecutor ile düzenli biçimde yönetmek var.
Sıkça Sorulan Sorular
“İş Parçacıkları ve GIL” dersi ücretsiz mi?
Evet — “İş Parçacıkları ve GIL” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“İş Parçacıkları ve GIL” dersinde ne öğreneceğim?
Python iş parçacığı kullanımının sınırlarını anlayın Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“İş Parçacıkları ve GIL” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İş Parçacıkları ve GIL
- ThreadPoolExecutor
- multiprocessing Temelleri
- Verileri Güvenle Paylaşma