0Pricing
AI Agents · Ders

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 programs

Olay 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 thread

asyncio.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

  1. Aracı Geliştiricileri İçin Eşzamansız Python
  2. Olay Kuyrukları ve Mesaj Aracıları
  3. Engellemesiz Paralel Araç Çalıştırma
  4. Eşzamansız Aracı Çerçeveleri: LangChain ve Ötesi
← AI Agents Sayfasına Dön