[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:ai-engineer\u002Faipy-async-concurrency-ml-serving":4,"config":193},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":97,"samples":108},"ai-engineer","AI Engineer","","aipy-async-concurrency-ml-serving","Aipy Async Concurrency Ml Serving","tr",75,2025,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94],{"key":19,"name":20,"count":11},"agents-tool-use","Agents Tool Use",{"key":22,"name":23,"count":11},"aimlops-deployment-strategies-ml","Aimlops Deployment Strategies Ml",{"key":25,"name":26,"count":11},"aimlops-experiment-tracking-reproducibility","Aimlops Experiment Tracking Reproducibility",{"key":28,"name":29,"count":11},"aimlops-feature-store-data-versioning","Aimlops Feature Store Data Versioning",{"key":31,"name":32,"count":11},"aimlops-ml-cicd-pipelines","Aimlops Ml Cicd Pipelines",{"key":34,"name":35,"count":11},"aimlops-model-monitoring-drift-detection","Aimlops Model Monitoring Drift Detection",{"key":37,"name":38,"count":11},"aimlops-model-versioning-registry","Aimlops Model Versioning Registry",{"key":8,"name":9,"count":11},{"key":41,"name":42,"count":11},"aipy-data-pipeline-dataloader","Aipy Data Pipeline Dataloader",{"key":44,"name":45,"count":11},"aipy-gpu-memory-management","Aipy Gpu Memory Management",{"key":47,"name":48,"count":11},"aipy-numpy-vectorization-broadcasting","Aipy Numpy Vectorization Broadcasting",{"key":50,"name":51,"count":11},"aipy-python-ml-packaging-environments","Aipy Python Ml Packaging Environments",{"key":53,"name":54,"count":11},"aipy-tensor-ops-autograd","Aipy Tensor Ops Autograd",{"key":56,"name":57,"count":11},"embeddings-vector-search","Embeddings Vector Search",{"key":59,"name":60,"count":11},"evaluation-testing","Evaluation Testing",{"key":62,"name":63,"count":11},"fine-tuning-adaptation","Fine Tuning Adaptation",{"key":65,"name":66,"count":11},"inference-serving","Inference Serving",{"key":68,"name":69,"count":11},"llm-fundamentals","Llm Fundamentals",{"key":71,"name":72,"count":11},"prompt-engineering","Prompt Engineering",{"key":74,"name":75,"count":11},"rag-chunking-indexing","Rag Chunking Indexing",{"key":77,"name":78,"count":11},"rag-embeddings-similarity","Rag Embeddings Similarity",{"key":80,"name":81,"count":11},"rag-evaluation","Rag Evaluation",{"key":83,"name":84,"count":11},"rag-generation-context","Rag Generation Context",{"key":86,"name":87,"count":11},"rag-reranking-fusion","Rag Reranking Fusion",{"key":89,"name":90,"count":11},"rag-retrieval","Rag Retrieval",{"key":92,"name":93,"count":11},"rag-retrieval-search","Rag Retrieval Search",{"key":95,"name":96,"count":11},"safety-guardrails","Safety Guardrails",[98,102,105],{"key":99,"name":100,"count":101},"llm-rag","LLM\u002FRAG",450,{"key":103,"name":104,"count":101},"mlops","MLOps",{"key":106,"name":107,"count":101},"python","Python",[109,127,140,154,167,180],{"id":110,"topic":9,"difficulty":111,"body":112,"options":113,"correct_key":121,"explanation":126},"019f9407-fb56-7eaa-a163-6d10758cb80c",1,"Standart CPython'da Global Interpreter Lock (GIL), tek bir process içinde çalışan thread'ler hakkında neyi garanti eder?",[114,117,120,123],{"key":115,"text":116},"a","Thread'lerin herhangi bir C uzantısını çağırması yasaktır, çünkü GIL tüm native kod yollarını engeller.",{"key":118,"text":119},"b","Her thread kendi ayrılmış CPU çekirdeğini alır, böylece bytecode yürütme çekirdekler arasında tam paralel olur.",{"key":121,"text":122},"c","Makinede birden çok CPU çekirdeği olsa bile, aynı anda yalnızca bir thread Python bytecode'u çalıştırır.",{"key":124,"text":125},"d","GIL yalnızca process başlangıcında vardır ve ilk thread modülleri import etmeyi bitirdiğinde kaldırılır.","GIL, standart bir CPython process'inde kaç CPU çekirdeği olursa olsun aynı anda yalnızca bir thread'in Python bytecode'u çalıştırmasına izin veren bir mutex'tir. (b) GIL'in Python bytecode için tam olarak engellediği gerçek çok-çekirdekli paralelliği anlatıyor. (c) yanlıştır — C uzantıları GIL'i sıkça bırakabilir. (d) GIL'in çalışma biçimiyle uyuşmayan, sadece başlangıca özgü bir yaşam süresi uyduruyor.",{"id":128,"topic":9,"difficulty":111,"body":129,"options":130,"correct_key":115,"explanation":139},"019f9407-fb9f-7f10-a566-9047c2cfc731","Bir ekip, CPU-bound bir tokenizasyon\u002Fön-işleme fonksiyonunu 4 `threading.Thread` üzerinde çalıştırıyor ve 4 çekirdekli bir makinede yaklaşık 4 kat hızlanma bekliyor. Standart CPython'da gerçekte ne olur?",[131,133,135,137],{"key":115,"text":132},"Neredeyse hiç hızlanma sağlamaz, çünkü GIL yine aynı anda yalnızca bir thread'in Python bytecode'u çalıştırmasına izin verir.",{"key":118,"text":134},"Neredeyse tam olarak 4 kat hızlanır, çünkü her thread saf Python hesaplaması için bir çekirdeği kendine alır.",{"key":121,"text":136},"1 thread'e göre yaklaşık 4 kat yavaşlar, çünkü GIL 4 thread'i uçtan uca hiçbir çakışma olmadan tamamen serileştirir.",{"key":124,"text":138},"Thread'ler oluşturulma anında RuntimeError fırlatır, çünkü CPython birden fazla CPU-bound thread'i reddeder.","Saf-Python, CPU-bound iş için GIL, 4 thread'in etkin olarak tek bir çekirdek üzerinde bytecode çalıştırmak için sırayla devralması anlamına gelir; bu yüzden gerçek anlamda neredeyse hiç hızlanma olmaz — CPU-bound Python işleri için multiprocessing'in tercih edilmesinin nedeni tam olarak budur. (a) GIL'in engellediği gerçek paralelliği anlatıyor. (c) yavaşlamayı abartıyor; küçük bir GIL-geçiş maliyeti vardır, 4 kat ceza değil. (d) var olmayan bir kısıtlama uyduruyor — thread'ler sorunsuz oluşturulur ve çalışır, sadece bytecode için paralel değildir.",{"id":141,"topic":9,"difficulty":142,"body":143,"options":144,"correct_key":124,"explanation":153},"019f9407-fba7-7a6f-b9c8-90373dd466f2",2,"Bir model-serving endpoint'i, inference çalıştırmadan önce uzak bir feature store'a bir ağ çağrısı yapıyor ve yanıt için ~50ms bekliyor. O ağ çağrısında (bloklayan bir çağrı yerine) `await` kullanmak, aynı tek thread üzerinde daha fazla eşzamanlı request'e hizmet vermeye neden yardımcı olur?",[145,147,149,151],{"key":115,"text":146},"Ağ çağrısını CPU-bound bir işleme dönüştürür, böylece GIL artık ona hiç uygulanmaz.",{"key":118,"text":148},"Feature store'un daha hızlı yanıt vermesine neden olur, çünkü await edilen çağrılar hat üzerinde bloklayanlara göre önceliklendirilir, tıpkı QoS etiketlemesinin paketleri yeniden sıralaması gibi.",{"key":121,"text":150},"Await edilen her çağrı için arka planda yeni bir OS thread'i başlatır, böylece bekleme otomatik olarak paralel gerçekleşir.",{"key":124,"text":152},"I\u002FO beklerken coroutine kontrolü event loop'a geri bırakır, böylece diğer request'ler çalışabilir.","Bir I\u002FO işleminde `await`, o coroutine'i askıya alır ve kontrolü event loop'a döndürür; event loop da ağ yanıtı gelene kadar bekleyen diğer coroutine'leri çalıştırabilir — async'in I\u002FO-bound bekleme için temel faydası tam olarak budur. (a) ağ I\u002FO'sunu yanlışlıkla CPU-bound olarak tanımlıyor. (b) var olmayan bir ağ-seviyesi önceliklendirme uyduruyor. (d) asyncio'nun tek-thread'li event loop'unun çalışma biçimini değil, çağrı-başına-thread modelini anlatıyor.",{"id":155,"topic":9,"difficulty":142,"body":156,"options":157,"correct_key":118,"explanation":166},"019f9407-fbc6-7a6a-a203-071c86689bee","Bir `async def` request handler'ı içinde, bir geliştirici çalışması 200ms süren senkron, CPU-ağır bir inference fonksiyonunu doğrudan çağırıyor (ne `await` var ne de başka bir yere devrediliyor). Bu 200ms boyunca aynı event loop tarafından işlenen diğer eşzamanlı request'ler üzerindeki etki nedir?",[158,160,162,164],{"key":115,"text":159},"Diğer coroutine'ler normal şekilde çalışmaya devam eder, çünkü `async def` handler'lar tanım gereği her zaman bloklamayandır.",{"key":118,"text":161},"Event loop tüm 200ms boyunca bloklanır, bu yüzden ilgisiz request'ler dahil hiçbir başka coroutine ilerleyemez.",{"key":121,"text":163},"Event loop yeni bağlantı kabul etmeyi durdurur ama zaten planlanmış coroutine'leri tam hızda işlemeye devam eder.",{"key":124,"text":165},"Yalnızca başka client IP adreslerinden gelen request'ler gecikir; aynı client'tan gelenler etkilenmeden devam eder.","Bir coroutine içindeki senkron, CPU-bound bir çağrı event loop ile aynı tek thread üzerinde çalışır ve hiç kontrolü bırakmaz, bu yüzden tüm süresi boyunca tüm event loop'u bloklar — bekleyen her başka coroutine de durur. (a) yanlıştır; bir fonksiyonu `async def` ilan etmek içindeki bloklayan kodu bloklamayan yapmaz. (b) ve (c), tek-thread'li bir event loop'un çalışma biçimini yansıtmayan kısmi-bloklama davranışları uyduruyor.",{"id":168,"topic":9,"difficulty":111,"body":169,"options":170,"correct_key":118,"explanation":179},"019f9407-fbc8-7554-aeaa-e1c31e6c3650","Bir Python model-serving API bağlamında, 'I\u002FO-bound' iş ile 'CPU-bound' işi en iyi ne ayırt eder?",[171,173,175,177],{"key":115,"text":172},"Kodun gerçekte ne yaptığından bağımsız olarak, I\u002FO-bound iş her zaman CPU-bound işten daha hızlı çalışır.",{"key":118,"text":174},"I\u002FO-bound iş, zamanının çoğunu dış sistemleri beklemekle geçirir; CPU-bound iş ise zamanının çoğunu hesaplama yaparak geçirir.",{"key":121,"text":176},"CPU-bound iş, bir `async def` fonksiyonu içindeki herhangi bir koddur; I\u002FO-bound iş ise sıradan bir `def` fonksiyonu içindeki herhangi bir koddur.",{"key":124,"text":178},"I\u002FO-bound iş yalnızca diskten dosya okumaya uygulanır; herhangi bir ağ çağrısı bunun yerine CPU-bound olarak sınıflandırılır, çünkü socket'ler kernel thread'leri tarafından yönetilir.","Ayrım, zamanın gerçekte nerede harcandığıyla ilgilidir: I\u002FO-bound iş (ör. bir ağ yanıtını ya da disk okumasını beklemek) çoğunlukla boşta beklemedir, CPU-bound iş (ör. tensör matematiği, tokenizasyon döngüleri) ise çoğunlukla aktif hesaplamadır — bu ayrım async, thread ya da process'in yardımcı olup olmadığını belirler. (b) yanlış bir evrensel hız iddiası yapıyor. (c) `async def`\u002F`def` sözdizimini işin gerçek doğasıyla karıştırıyor. (d) ağ çağrılarını I\u002FO-bound işten yanlışlıkla dışlıyor.",{"id":181,"topic":9,"difficulty":142,"body":182,"options":183,"correct_key":124,"explanation":192},"019f9407-fbcc-7d7c-8052-e1fbb6a5f42a","```python\nimport asyncio\n\nasync def handle_request(req):\n    result = run_cpu_heavy_inference(req)  # sync, ~150ms CPU işi\n    return result\n\nasync def main():\n    await asyncio.gather(*(handle_request(r) for r in requests))\n```\n`requests` içinde 10 request varken, `asyncio.gather` yaklaşık ne kadar sürer ve neden?",[184,186,188,190],{"key":115,"text":185},"Toplamda yaklaşık 150ms, çünkü `asyncio.gather` 10 coroutine'in CPU işini gerçekten ayrı çekirdeklerde paralel çalıştırır.",{"key":118,"text":187},"Süresiz olarak takılır, çünkü `run_cpu_heavy_inference`'ın kendisi `async def` ile tanımlanmamıştır.",{"key":121,"text":189},"Toplamda yaklaşık 15ms, çünkü `asyncio.gather` CPU işini tüm request'lere otomatik olarak eşit böler.",{"key":124,"text":191},"Toplamda yaklaşık 1500ms, çünkü her `handle_request` çağrısı hiçbir çakışma olmadan event loop'u tam 150ms boyunca bloklar.","Bir coroutine içinde senkron, CPU-bound bir fonksiyonu doğrudan çağırmak (ne `await` ne de bir thread\u002Fprocess'e devretme yok), tek event loop thread'ini her çağrının tüm süresi boyunca bloklar; 10 request birbiri ardına hiç çakışma olmadan çalıştığında toplam süre kabaca 10 x 150ms = 1500ms olur. (a) `asyncio.gather`'ın tek başına bloklayan senkron çağrılar için sağlamadığı, çekirdekler arası gerçek paralel yürütmeyi anlatıyor. (c) var olmayan otomatik iş bölüşümü uyduruyor. (d) yanlıştır — bir coroutine'den sıradan bir senkron fonksiyon çağırmak sorunsuz çalışır, sadece bloklayıcıdır.",{"fields":194,"seniorities":372,"interview_shapes":373,"locales":378,"oauth":380,"question_count":383,"coach_enabled":384,"jd_match_enabled":384},[195,218,238,255,279,286,305,324,346,353,359,366],{"key":196,"name_tr":197,"name_en":197,"sort":111,"specializations":198},"backend","Backend",[199,202,205,206,209,212,215],{"key":200,"name":201,"field":196},"general","Genel",{"key":203,"name":204,"field":196},"go","Go",{"key":106,"name":107,"field":196},{"key":207,"name":208,"field":196},"java","Java",{"key":210,"name":211,"field":196},"csharp","C#\u002F.NET",{"key":213,"name":214,"field":196},"nodejs","Node.js",{"key":216,"name":217,"field":196},"php","PHP",{"key":219,"name_tr":220,"name_en":220,"sort":142,"specializations":221},"frontend","Frontend",[222,223,226,229,232,235],{"key":200,"name":201,"field":219},{"key":224,"name":225,"field":219},"javascript","JavaScript",{"key":227,"name":228,"field":219},"typescript","TypeScript",{"key":230,"name":231,"field":219},"react","React",{"key":233,"name":234,"field":219},"vue","Vue",{"key":236,"name":237,"field":219},"angular","Angular",{"key":239,"name_tr":240,"name_en":240,"sort":241,"specializations":242},"fullstack","Fullstack",3,[243,244,245,246,247,248,249,250,251,252,253,254],{"key":200,"name":201,"field":239},{"key":203,"name":204,"field":196},{"key":106,"name":107,"field":196},{"key":207,"name":208,"field":196},{"key":210,"name":211,"field":196},{"key":213,"name":214,"field":196},{"key":216,"name":217,"field":196},{"key":224,"name":225,"field":219},{"key":227,"name":228,"field":219},{"key":230,"name":231,"field":219},{"key":233,"name":234,"field":219},{"key":236,"name":237,"field":219},{"key":256,"name_tr":257,"name_en":257,"sort":258,"specializations":259},"devops-cloud","DevOps \u002F Cloud",4,[260,261,264,267,270,273,276],{"key":200,"name":201,"field":256},{"key":262,"name":263,"field":256},"aws","AWS",{"key":265,"name":266,"field":256},"gcp","GCP",{"key":268,"name":269,"field":256},"azure","Azure",{"key":271,"name":272,"field":256},"kubernetes","Kubernetes",{"key":274,"name":275,"field":256},"terraform","Terraform",{"key":277,"name":278,"field":256},"linux","Linux",{"key":5,"name_tr":6,"name_en":6,"sort":280,"specializations":281},5,[282,283,284,285],{"key":200,"name":201,"field":5},{"key":106,"name":107,"field":5},{"key":99,"name":100,"field":5},{"key":103,"name":104,"field":5},{"key":287,"name_tr":288,"name_en":289,"sort":290,"specializations":291},"database","Veritabanı","Database",6,[292,293,296,299,302],{"key":200,"name":201,"field":287},{"key":294,"name":295,"field":287},"postgresql","PostgreSQL",{"key":297,"name":298,"field":287},"mysql","MySQL",{"key":300,"name":301,"field":287},"mongodb","MongoDB",{"key":303,"name":304,"field":287},"redis","Redis",{"key":306,"name_tr":307,"name_en":308,"sort":309,"specializations":310},"mobile","Mobil","Mobile",7,[311,312,315,318,321],{"key":200,"name":201,"field":306},{"key":313,"name":314,"field":306},"ios-swift","iOS (Swift)",{"key":316,"name":317,"field":306},"android-kotlin","Android (Kotlin)",{"key":319,"name":320,"field":306},"flutter","Flutter",{"key":322,"name":323,"field":306},"react-native","React Native",{"key":325,"name_tr":326,"name_en":327,"sort":328,"specializations":329},"security","Güvenlik","Security",8,[330,331,334,337,340,343],{"key":200,"name":201,"field":325},{"key":332,"name":333,"field":325},"appsec","AppSec",{"key":335,"name":336,"field":325},"offensive-pentest","Offensive \u002F Pentest",{"key":338,"name":339,"field":325},"cloud-security","Cloud Security",{"key":341,"name":342,"field":325},"devsecops","DevSecOps",{"key":344,"name":345,"field":325},"blue-team-incident","Blue Team \u002F Incident",{"key":347,"name_tr":348,"name_en":349,"sort":350,"specializations":351},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[352],{"key":200,"name":201,"field":347},{"key":354,"name_tr":355,"name_en":355,"sort":356,"specializations":357},"data-engineer","Data Engineer",10,[358],{"key":200,"name":201,"field":354},{"key":360,"name_tr":361,"name_en":362,"sort":363,"specializations":364},"game-dev","Oyun Geliştirme","Game Development",11,[365],{"key":200,"name":201,"field":360},{"key":367,"name_tr":368,"name_en":368,"sort":369,"specializations":370},"ml-engineer","ML Engineer",12,[371],{"key":200,"name":201,"field":367},[14,15,16],{"junior":374,"mid":376,"senior":377},{"questions":375,"median_sec":3},20,{"questions":375,"median_sec":3},{"questions":375,"median_sec":3},[10,379],"en",[381,382],"google","github",21750,true]