Aracı Geliştiricileri İçin Eşzamansız Python
asyncio temelleri, async def, await, olay döngüsü — eşzamansız çalışma modeli.
Aracı Geliştiricileri İçin Eşzamansız Python, CoddyKit'te ücretsiz bir AI Agents 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, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Ajanlar İçin Neden Eşzamansızlık?
Ajanlar birçok G/Ç ağırlıklı çağrı yapar: LLM API'leri, web istekleri ve veritabanı sorguları. Eşzamanlı kod, bu çağrıların tamamlanmasını beklerken boşta kalır. Eşzamansız kod, bu beklemeler sırasında başka işleri yürütür ve işlem hacmini büyük ölçüde artırır.
Eşzamansızlığın Temelleri: async def ve await
async def bir eş yordam işlevi tanımlar. await, beklenen işlem tamamlanana kadar yürütmeyi askıya alır ve bu sırada olay döngüsünün diğer eş yordamları çalıştırmasına olanak tanır.
import asyncio
async def fetch_data(source: str) -> str:
print(f'Starting fetch from {source}')
await asyncio.sleep(1) # Simulates a network call
print(f'Finished fetch from {source}')
return f'Data from {source}'
async def main():
# Sequential: takes 2 seconds total
result1 = await fetch_data('source-A')
result2 = await fetch_data('source-B')
print('Sequential results:', result1, result2)
asyncio.run(main())
# asyncio.run() starts the event loop and runs main()
# It is the entry point for async programsOlay Döngüsü
Olay döngüsü, asyncio'nun temel bileşenidir. Eş yordamlar ve G/Ç geri çağırmaları için bir kuyruğu yönetir ve bunları hazır olduklarında çalıştırır. Tüm eşzamansız kodlar, tek bir iş parçacığında olay döngüsünün içinde çalışır.
import asyncio
async def task_a():
print('Task A: start')
await asyncio.sleep(2)
print('Task A: done')
async def task_b():
print('Task B: start')
await asyncio.sleep(1)
print('Task B: done')
async def main():
# asyncio.gather runs both tasks concurrently
# Total time: ~2 seconds (not 3)
await asyncio.gather(task_a(), task_b())
print('Both tasks complete')
# Expected output order:
# Task A: start
# Task B: start
# Task B: done <- after 1s
# Task A: done <- after 2s
# Both tasks complete
asyncio.run(main())Eş Yordamlar ve İş Parçacıkları
Eş yordamlar işbirlikçidir: await ile denetimi açıkça bırakırlar. İş parçacıkları öncelikli olarak planlanır: OS bunlar arasında istediği zaman geçiş yapabilir. Eş yordamlar daha hafiftir, G/Ç işlemleri için GIL sorunları yaşamaz ve akıl yürütülmeleri daha kolaydır.
import asyncio
import threading
import time
# Thread approach: multiple OS threads
def thread_worker(name):
print(f'Thread {name}: start')
time.sleep(1) # Blocks the thread
print(f'Thread {name}: done')
threads = [threading.Thread(target=thread_worker, args=(i,)) for i in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
print('---')
# Coroutine approach: single-threaded event loop
async def coro_worker(name):
print(f'Coro {name}: start')
await asyncio.sleep(1) # Suspends, does NOT block other coroutines
print(f'Coro {name}: done')
async def main():
await asyncio.gather(*[coro_worker(i) for i in range(3)])
asyncio.run(main())
# Both approaches run 3 tasks in ~1 second total, but coroutines use one threadasyncio.run() Giriş Noktası
asyncio.run() yeni bir olay döngüsü oluşturur, verilen eş yordamı tamamlanana kadar çalıştırır ve ardından döngüyü kapatır. Python 3.7 ve sonraki sürümlerdeki eşzamansız programlar için standart giriş noktasıdır.
import asyncio
async def agent_main():
print('Agent starting')
# All agent async work goes here
results = await asyncio.gather(
asyncio.sleep(0.1), # Simulated LLM call
asyncio.sleep(0.1), # Simulated DB query
)
print('Agent done')
return 'complete'
# Run the agent
result = asyncio.run(agent_main())
print('Result:', result)
# WRONG: calling asyncio.run() inside an already-running event loop
# In Jupyter notebooks, use: await agent_main() directly
# Or: nest_asyncio.apply() then asyncio.run()Yaygın Hata: Eşzamansız Bağlamda Engelleme
Eşzamansız kod içinde engelleyici işlevleri (time.sleep, requests.get, eşzamanlı dosya G/Ç işlemleri) hiçbir zaman çağırmayın. Bu, olay döngüsünün tamamını engelleyerek tüm eşzamanlılığı ortadan kaldırır.
import asyncio
import time
import httpx
# WRONG: blocks the event loop
async def bad_agent_step():
time.sleep(2) # Blocks all other coroutines
# requests.get(url) # Also blocks - do NOT use requests in async code
return 'done'
# RIGHT: use async equivalents
async def good_agent_step():
await asyncio.sleep(2) # Suspends, other coroutines can run
async with httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/data')
return response.text
# For CPU-intensive work: use run_in_executor
import concurrent.futures
async def cpu_intensive_step(data: str):
loop = asyncio.get_event_loop()
with concurrent.futures.ProcessPoolExecutor() as pool:
result = await loop.run_in_executor(pool, expensive_cpu_fn, data)
return result
def expensive_cpu_fn(data):
# CPU-bound work runs in separate process
return data.upper()
print('Blocking vs non-blocking patterns demonstrated')await Unutuldu: Sessiz Hata
await ifadesini unutmak hata oluşturmaz; sonuç yerine bir eş yordam nesnesi döndürür. Bu, sonraki aşamalarda hatalara veya boş sonuçlara yol açan sessiz bir hatadır.
import asyncio
async def get_answer() -> str:
await asyncio.sleep(0.1)
return 'The answer is 42'
async def bad_call():
result = get_answer() # WRONG: forgot await
print(type(result)) # <class 'coroutine'> - not a string!
# Using result as a string here causes AttributeError or wrong behavior
return result
async def good_call():
result = await get_answer() # CORRECT
print(type(result)) # <class 'str'>
return result
async def main():
bad = await bad_call()
print('Bad result:', bad) # coroutine object, not the string
good = await good_call()
print('Good result:', good) # 'The answer is 42'
# Clean up the uncollected coroutine
if asyncio.iscoroutine(bad):
bad.close()
asyncio.run(main())İç İçe Olay Döngüsü Sorunu
Zaten çalışmakta olan bir olay döngüsünün içinde asyncio.run() çağrısı yapmak (örneğin Jupyter veya FastAPI içinde) bir RuntimeError oluşturur. Çözümler: doğrudan await kullanın veya not defterleri için nest_asyncio kullanın.
import asyncio
async def my_agent_coroutine():
await asyncio.sleep(0.1)
return 'done'
# In FastAPI or other async frameworks, the event loop is already running
# Use await directly in async endpoints:
async def fastapi_endpoint():
# WRONG inside async context:
# result = asyncio.run(my_agent_coroutine()) # RuntimeError!
# CORRECT: just await
result = await my_agent_coroutine()
return result
# In Jupyter notebooks: install nest_asyncio
# import nest_asyncio
# nest_asyncio.apply()
# Then asyncio.run() works
# Detect if running in event loop:
def run_agent(coro):
try:
loop = asyncio.get_running_loop()
# Already in async context
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor() as pool:
future = pool.submit(asyncio.run, coro)
return future.result()
except RuntimeError:
# No running loop
return asyncio.run(coro)
print('Nested event loop solution defined')asyncio.create_task
Bir eş yordamı hemen beklemeden çalıştırılmak üzere zamanlamak için asyncio.create_task() kullanın. Bu, birden çok görev başlatmanıza ve tamamlanmalarını daha sonra beklemenize olanak tanır.
import asyncio
async def background_job(job_id: int) -> str:
await asyncio.sleep(0.5)
return f'Job {job_id} completed'
async def main():
# Start all tasks without waiting
task1 = asyncio.create_task(background_job(1))
task2 = asyncio.create_task(background_job(2))
task3 = asyncio.create_task(background_job(3))
# Do other work while tasks run
print('Tasks started, doing other work...')
await asyncio.sleep(0.1)
print('Other work done')
# Now wait for all tasks
results = await asyncio.gather(task1, task2, task3)
print('All results:', results)
# Or wait for the first to complete
task_a = asyncio.create_task(background_job(4))
task_b = asyncio.create_task(background_job(5))
done, pending = await asyncio.wait([task_a, task_b], return_when=asyncio.FIRST_COMPLETED)
for t in pending:
t.cancel() # Cancel remaining tasks
print('First result:', done.pop().result())
asyncio.run(main())Eşzamansız Bağlam Yöneticileri
Birçok eşzamansız kitaplık, async with ile eşzamansız bağlam yöneticilerini kullanır. Bu, eşzamansız kodda bağlantıların ve kaynakların doğru biçimde kurulup temizlenmesini sağlar.
import asyncio
import httpx
async def fetch_multiple_urls(urls: list) -> list:
# async with ensures the client is properly closed
async with httpx.AsyncClient(timeout=10.0) as client:
# Fetch all URLs concurrently
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks, return_exceptions=True)
results = []
for url, response in zip(urls, responses):
if isinstance(response, Exception):
results.append({'url': url, 'error': str(response)})
else:
results.append({'url': url, 'status': response.status_code})
return results
# Async generators for streaming
async def stream_agent_events():
events = ['thinking', 'searching', 'generating', 'done']
for event in events:
await asyncio.sleep(0.2) # Simulate event arrival
yield event
async def consume_stream():
async for event in stream_agent_events():
print(f'Event: {event}')
asyncio.run(consume_stream())Eşzamansız Kodda Hata İşleme
Tüm toplu işlemi iptal etmeden tek tek görevlerdeki başarısızlıkları yakalamak için asyncio.gather(..., return_exceptions=True) kullanın. Her sonucu istisna türleri açısından denetleyin.
import asyncio
async def might_fail(task_id: int) -> str:
await asyncio.sleep(0.1)
if task_id == 2:
raise ValueError(f'Task {task_id} failed')
return f'Task {task_id} succeeded'
async def robust_gather():
tasks = [might_fail(i) for i in range(1, 5)]
# return_exceptions=True: exceptions are returned as values, not raised
results = await asyncio.gather(*tasks, return_exceptions=True)
successes = []
failures = []
for i, result in enumerate(results):
if isinstance(result, Exception):
failures.append({'task': i + 1, 'error': str(result)})
else:
successes.append(result)
print(f'Succeeded: {len(successes)}, Failed: {len(failures)}')
print('Failures:', failures)
return successes, failures
asyncio.run(robust_gather())Bilgi Kontrolü: Eşzamansız Python
Ajan geliştirme için eşzamansız Python konusunu ne kadar anladığınızı sınayın.
Eşzamansız Python Özeti
Ajan geliştiricileri için temel eşzamansız Python kuralları: tüm G/Ç ağırlıklı işlemler için async def/await kullanın; eşzamansız bağlamda hiçbir zaman engelleyici işlevleri çağırmayın; paralel yürütme için asyncio.gather() kullanın; hatalara dayanıklı paralel çağrılar için return_exceptions=True kullanın; kaynak yönetimi için async with kullanın; CPU yoğun işleri bir işlem havuzu yürütücüsünde çalıştırın.
Sıkça Sorulan Sorular
“Aracı Geliştiricileri İçin Eşzamansız Python” dersi ücretsiz mi?
Evet — “Aracı Geliştiricileri İçin Eşzamansız Python” 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 AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Aracı Geliştiricileri İçin Eşzamansız Python” dersinde ne öğreneceğim?
asyncio temelleri, async def, await, olay döngüsü — eşzamansız çalışma modeli. AI Agents 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.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, 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.
“Aracı Geliştiricileri İçin Eşzamansız Python” 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 AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents 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
- Aracı Geliştiricileri İçin Eşzamansız Python
- Olay Kuyrukları ve Mesaj Aracıları
- Engellemesiz Paralel Araç Çalıştırma
- Eşzamansız Aracı Çerçeveleri: LangChain ve Ötesi