yoklateknik mülakat

Python Backend Mülakat Soruları

450 doğrulanmış Python Backend mülakat sorusu — cevaplarıyla çöz, açıklamalarıyla öğren, gerçek simülasyonda kendini test et.

Gerçek simülasyonu dene →

Örnek sorular

Python Concurrency AsyncZorluk 1
import threading

def greet(name):
    print(f"hello {name}")

t = threading.Thread(target=greet, args=("ada",))
t.start()
t.join()
print("done")

Bu ne yazdırır?
  • aTypeError fırlatır çünkü args bir dict olmalı, tuple değil
  • bÖnce "done" sonra "hello ada" yazdırır, çünkü ana thread varsayılan olarak t'yi beklemez
  • cÖnce "hello ada" sonra "done" — join() t bitene kadar bloklar
  • dHiçbir şey yazdırmaz çünkü target= bir referans değil, bağlı bir fonksiyon çağrısı bekler
Açıklama:threading.Thread(target=greet, args=("ada",)), start() çağrıldığında greet("ada")'nın yeni bir thread'de çalışmasını planlar. join(), t bitene kadar çağıran thread'i bloklar; bu yüzden "hello ada" her zaman "done"'dan önce yazdırılır. args, dict değil pozisyonel argümanlardan oluşan bir tuple/iterable alır.
Python Concurrency AsyncZorluk 1
import asyncio

async def compute():
    print("computing")
    return 42

result = compute()
print(result)

Ne olur?
  • a<coroutine object compute at 0x...> gibi bir şey yazdırır; "computing" hiç yazdırılmaz
  • bTypeError fırlatır çünkü compute() await ile çağrılmalıdır
  • cÖnce "computing" yazdırır, hemen ardından 42 döner
  • d42'yi hemen yazdırır, çünkü compute() senkron çalışır
Açıklama:Bir async def fonksiyonunu çağırmak gövdesini çalıştırmaz — bir coroutine nesnesi oluşturup döndürür. Gövde ancak coroutine await edildiğinde (ör. asyncio.run(compute()) içinde ya da await compute() ile) çalışmaya başlar. Burada result hiç await edilmediği için "computing" hiç yazdırılmaz; Python ayrıca "coroutine was never awaited" uyarısı da verebilir.
Python Concurrency AsyncZorluk 1
import asyncio

async def main():
    print("start")
    await asyncio.sleep(0.1)
    print("end")

asyncio.run(main())

Bu script çalıştırıldığında ne yazdırır?
  • aÖnce "end" sonra "start"
  • bRuntimeError fırlatır çünkü main()'in bir dönüş değeri yok
  • cSadece "start"; asyncio.run coroutine'in bitmesini beklemez
  • dÖnce "start" sonra "end", arada kısa bir bekleme ile
Açıklama:asyncio.run(main()) yeni bir event loop oluşturur, main() coroutine'ini tamamlanana kadar çalıştırır ve loop'u kapatır. Çalışma yukarıdan aşağıya ilerler: önce "start" yazdırılır, sonra await asyncio.sleep(0.1) main'i yaklaşık 100ms askıya alır (başka hiçbir şeyi bloklamadan), ardından "end" yazdırılır.
Python Concurrency AsyncZorluk 1
import threading

def worker():
    print("working")

t = threading.Thread(target=worker)
t.start()
t.join()
print("main continues")

İki yazdırmanın sırası hakkında ne garanti edilir?
  • a"main continues" her zaman önce yazdırılır çünkü ana thread'in önceliği vardır
  • b"working", "main continues"'tan önce yazdırılması garantidir
  • cjoin() ile bile sıra belirsizdir, çünkü thread'ler rastgele zamanlanır
  • dHiçbir şey yazdırılmaz çünkü join(), start()'tan önce çağrılmalıdır
Açıklama:t.join(), t tamamen bitene kadar çağıran (ana) thread'i bloklar. "main continues" ancak join() döndükten sonra yazdırıldığı ve join(), worker() tamamlanmadan (dolayısıyla "working" yazdırılmadan) dönemeyeceği için sıralama garantilidir.
Python Concurrency AsyncZorluk 1
CPython'da Global Interpreter Lock (GIL) nedir?
  • aAynı anda yalnızca bir thread'in Python bytecode çalıştırmasına izin veren bir mutex
  • bBir makinede aynı anda birden fazla process'in Python çalıştırmasını tamamen engelleyen bir kilit
  • cKodu thread-safe yapmak için her with ifadesinde otomatik olarak alınan bir kilit
  • dthreading modülündeki çoklu thread kullanımını tamamen devre dışı bırakan bir yapılandırma bayrağı
Açıklama:GIL, CPython yorumlayıcısına içkin bir mutex'tir ve çok çekirdekli makinelerde bile herhangi bir anda yalnızca bir thread'in Python bytecode'u çalıştırmasını garanti eder. Bellek yönetimini (reference counting) basitleştirmek için vardır, ama tek bir process içindeki thread'ler arasında saf Python kodunun gerçek paralel çalışmasını sınırlar.
Python Concurrency AsyncZorluk 1
asyncio, birden fazla coroutine için eşzamanlılığı nasıl sağlar?
  • aHer coroutine'i otomatik olarak kendi OS thread'ine atayarak
  • bHer async def fonksiyonu için ayrı bir process başlatarak
  • cOnları tek bir thread üzerinde kooperatif şekilde çalıştırıp await noktalarında coroutine'ler arasında geçiş yaparak
  • dGIL'i kullanarak coroutine'leri gerçekten paralel olarak birden çok çekirdekte çalıştırarak
Açıklama:asyncio, tek bir thread üzerinde bir event loop çalıştırır. Coroutine'ler await noktalarında gönüllü olarak kontrolü bırakarak işbirliği yapar; event loop de sonra çalıştırılmaya hazır başka bir coroutine seçer. Varsayılan olarak preemption yoktur ve ekstra OS thread'i ya da process kullanılmaz — buradaki eşzamanlılık paralel çalışma değil, iç içe geçme (interleaving) anlamına gelir.

3300 soruluk Backend bankasında kendini sına.

Mülakata başla