0Pricing
Python Academy · Ders

Verileri Güvenle Paylaşma

Kuyrukları ve kilitleri kullanın

Verileri Güvenle Paylaşma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 4. 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.

Yarış Durumu Sorunu

Birden çok iş parçacığı aynı veriyi değiştirdiğinde işlemleri birbirine karışabilir ve sonucu bozabilir. Buna yarış durumu denir. Verileri güvenli biçimde paylaşmak için eşzamanlama araçlarına ihtiyacımız vardır.

import threading

counter = 0

def bump():
    global counter
    for _ in range(100000):
        counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter (may be < 200000):', counter)

Lock Yardıma Yetişiyor

Bir threading.Lock, aynı anda yalnızca bir iş parçacığının kritik bölüme girmesini sağlar. Paylaşılan güncellemenin çevresinde bir with bloğu kullanarak kilidi alın.

import threading

counter = 0
lock = threading.Lock()

def bump():
    global counter
    for _ in range(100000):
        with lock:
            counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter:', counter)

acquire ve release

Bir kilit, acquire() ve release() ile elle kullanılabilir; ancak with biçimi, bir hata oluşsa bile kilidi serbest bıraktığı için daha güvenlidir.

import threading

lock = threading.Lock()
lock.acquire()
try:
    print('inside critical section')
finally:
    lock.release()
print('released')

İş Parçacığı Güvenli Kuyruklar

queue.Queue sınıfı zaten iş parçacığı güvenlidir. İş parçacıkları açık kilitler olmadan put ve get kullanabilir; bu nedenle veri aktarmanın tercih edilen yolu budur.

import queue, threading

q = queue.Queue()

def producer():
    for i in range(3):
        q.put(i)

t = threading.Thread(target=producer)
t.start()
t.join()
while not q.empty():
    print('got', q.get())

Producer ve Consumer

Klasik düzen şöyledir: Producer'lar işi bir kuyruğa put eder, Consumer'lar işi get eder ve işler. Kuyruk tüm kilitleme işlemlerini yönetir.

import queue, threading

q = queue.Queue()
results = []

def consumer():
    while True:
        item = q.get()
        if item is None:
            break
        results.append(item * 10)
        q.task_done()

t = threading.Thread(target=consumer)
t.start()
for i in range(3):
    q.put(i)
q.put(None)
t.join()
print(results)

join ve task_done

q.join(), put ile kuyruğa eklenen her öğe için eşleşen bir task_done() çağrısı yapılana kadar bekler. Bu, ana iş parçacığının tüm işlerin tamamlanmasını beklemesini sağlar.

import queue, threading

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        q.task_done()

threading.Thread(target=worker, daemon=True).start()
for i in range(5):
    q.put(i)
q.join()
print('all items processed')

Yeniden Giriş için RLock

Düz bir Lock, aynı iş parçacığı onu iki kez almaya çalışırsa kilitlenir. Bir threading.RLock (yeniden girilebilir kilit) edinme sayısını tutarak buna izin verir.

import threading

rlock = threading.RLock()

def outer():
    with rlock:
        inner()

def inner():
    with rlock:
        print('re-entered safely')

outer()

Sinyal Göndermek için Event

Bir threading.Event, bir iş parçacığının diğerlerine sinyal göndermesini sağlar. İş parçacıkları, başka bir iş parçacığı set() çağırana kadar wait() çağrısıyla bekler.

import threading

start = threading.Event()

def worker():
    start.wait()
    print('go!')

t = threading.Thread(target=worker)
t.start()
print('setting event')
start.set()
t.join()

Süreçler Arasında Paylaşım

Süreçler arasında bunun yerine multiprocessing.Queue kullanın. Bu yapı, nesneleri ayrı bellek alanları arasında serileştirir.

import multiprocessing as mp

def producer(q):
    for i in range(3):
        q.put(i * i)

if __name__ == '__main__':
    q = mp.Queue()
    p = mp.Process(target=producer, args=(q,))
    p.start()
    p.join()
    while not q.empty():
        print('received', q.get())

Kilitlenmeden Kaçınma

Kilitlenme, iş parçacıkları birbirlerinin kilitlerini sonsuza dek beklediğinde oluşur. Birden çok kilit alırken her yerde bunları her zaman aynı sırayla alarak bundan kaçının.

import threading

lock_a = threading.Lock()
lock_b = threading.Lock()

def safe():
    with lock_a:
        with lock_b:
            print('acquired in consistent order')

safe()

Lock Yerine Queue Tercih Edin

Mümkün olduğunda, kilitlerle korunan değiştirilebilir paylaşılan durum yerine Queue ile ileti aktarımını tercih edin. Bu yaklaşımın mantığını kavramak daha kolaydır ve hata oluşturma olasılığı çok daha düşüktür.

import queue

q = queue.Queue()
for word in ['safe', 'simple', 'clear']:
    q.put(word)
while not q.empty():
    print(q.get())

Kısa Kontrol

Güvenli veri paylaşımı hakkındaki anlayışınızı sınayın.

Özet

Verileri güvenli biçimde paylaşmayı öğrendiniz:

  • Yarış durumları, korunmayan paylaşılan durumu bozar.
  • Lock ve RLock, kritik bölümleri korur.
  • queue.Queue iş parçacığı güvenlidir; süreçler arasında multiprocessing.Queue kullanın.
  • Event, iş parçacıkları arasında sinyal gönderir; tutarlı kilit sırası kilitlenmeyi önler.

Sıradaki kurs: subprocess ile harici programları çalıştırma.

Sıkça Sorulan Sorular

“Verileri Güvenle Paylaşma” dersi ücretsiz mi?

Evet — “Verileri Güvenle Paylaşma” 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.

“Verileri Güvenle Paylaşma” dersinde ne öğreneceğim?

Kuyrukları ve kilitleri kullanı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 4. dersidir.

“Verileri Güvenle Paylaşma” 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

  1. İş Parçacıkları ve GIL
  2. ThreadPoolExecutor
  3. multiprocessing Temelleri
  4. Verileri Güvenle Paylaşma
← Python Academy Sayfasına Dön