Movatterモバイル変換


[0]ホーム

URL:


Ana içeriğe geç
Join theFastAPI Cloud waiting list 🚀
Follow@fastapi onX (Twitter) to stay updated
FollowFastAPI onLinkedIn to stay updated
Subscribe to theFastAPI and friends newsletter 🎉
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor

Arka Plan Görevleri

🌐 Yapay Zekâ ve İnsanlar Tarafından Çeviri

Bu çeviri, insanlar tarafından yönlendirilen bir yapay zekâ ile oluşturuldu. 🤝

Orijinal anlamın yanlış anlaşılması ya da kulağa doğal gelmeme gibi hatalar içerebilir. 🤖

Yapay zekâ LLM'ini daha iyi yönlendirmemize yardımcı olarak bu çeviriyi iyileştirebilirsiniz.

İngilizce sürüm

Response döndürüldüktensonra çalıştırılacak arka plan görevleri tanımlayabilirsiniz.

Bu, request’ten sonra yapılması gereken; ancak client’ın response’u almadan önce tamamlanmasını beklemesine gerek olmayan işlemler için kullanışlıdır.

Örneğin:

  • Bir işlem gerçekleştirdikten sonra gönderilen email bildirimleri:
    • Bir email server’a bağlanmak ve email göndermek genellikle "yavaş" olduğundan (birkaç saniye), response’u hemen döndürüp email bildirimini arka planda gönderebilirsiniz.
  • Veri işleme:
    • Örneğin, yavaş bir süreçten geçmesi gereken bir dosya aldığınızı düşünün; "Accepted" (HTTP 202) response’u döndürüp dosyayı arka planda işleyebilirsiniz.

BackgroundTasks Kullanımı

ÖnceBackgroundTasks’i import edin vepath operation function’ınızdaBackgroundTasks tip bildirimi olan bir parametre tanımlayın:

fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}

FastAPI, sizin içinBackgroundTasks tipinde bir obje oluşturur ve onu ilgili parametre olarak geçirir.

Bir Görev Fonksiyonu Oluşturun

Arka plan görevi olarak çalıştırılacak bir fonksiyon oluşturun.

Bu, parametre alabilen standart bir fonksiyondur.

async def de olabilir, normaldef de olabilir;FastAPI bunu doğru şekilde nasıl ele alacağını bilir.

Bu örnekte görev fonksiyonu bir dosyaya yazacaktır (email göndermeyi simüle ediyor).

Ve yazma işlemiasync veawait kullanmadığı için fonksiyonu normaldef ile tanımlarız:

fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}

Arka Plan Görevini Ekleyin

Path operation function’ınızın içinde, görev fonksiyonunuzu.add_task() metodu ilebackground tasks objesine ekleyin:

fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_notification(email:str,message=""):withopen("log.txt",mode="w")asemail_file:content=f"notification for{email}:{message}"email_file.write(content)@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks):background_tasks.add_task(write_notification,email,message="some notification")return{"message":"Notification sent in the background"}

.add_task() şu argümanları alır:

  • Arka planda çalıştırılacak bir görev fonksiyonu (write_notification).
  • Görev fonksiyonuna sırayla geçirilecek argümanlar (email).
  • Görev fonksiyonuna geçirilecek keyword argümanlar (message="some notification").

Dependency Injection

BackgroundTasks kullanımı dependency injection sistemiyle de çalışır;BackgroundTasks tipinde bir parametreyi birden fazla seviyede tanımlayabilirsiniz: birpath operation function içinde, bir dependency’de (dependable), bir sub-dependency’de, vb.

FastAPI her durumda ne yapılacağını ve aynı objenin nasıl yeniden kullanılacağını bilir; böylece tüm arka plan görevleri birleştirilir ve sonrasında arka planda çalıştırılır:

fromtypingimportAnnotatedfromfastapiimportBackgroundTasks,Depends,FastAPIapp=FastAPI()defwrite_log(message:str):withopen("log.txt",mode="a")aslog:log.write(message)defget_query(background_tasks:BackgroundTasks,q:str|None=None):ifq:message=f"found query:{q}\n"background_tasks.add_task(write_log,message)returnq@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks,q:Annotated[str,Depends(get_query)]):message=f"message to{email}\n"background_tasks.add_task(write_log,message)return{"message":"Message sent"}
🤓 Other versions and variants

Tip

Prefer to use theAnnotated version if possible.

fromfastapiimportBackgroundTasks,Depends,FastAPIapp=FastAPI()defwrite_log(message:str):withopen("log.txt",mode="a")aslog:log.write(message)defget_query(background_tasks:BackgroundTasks,q:str|None=None):ifq:message=f"found query:{q}\n"background_tasks.add_task(write_log,message)returnq@app.post("/send-notification/{email}")asyncdefsend_notification(email:str,background_tasks:BackgroundTasks,q:str=Depends(get_query)):message=f"message to{email}\n"background_tasks.add_task(write_log,message)return{"message":"Message sent"}

Bu örnekte, response gönderildiktensonra mesajlarlog.txt dosyasına yazılacaktır.

Request’te bir query varsa, log’a bir arka plan göreviyle yazılır.

Ardındanpath operation function içinde oluşturulan başka bir arka plan görevi,email path parametresini kullanarak bir mesaj yazar.

Teknik Detaylar

BackgroundTasks sınıfı doğrudanstarlette.background’dan gelir.

fastapi üzerinden import edebilmeniz ve yanlışlıklastarlette.background içindeki alternatifBackgroundTask’i (sonundas olmadan) import etmemeniz için FastAPI’nin içine doğrudan import/eklenmiştir.

SadeceBackgroundTasks (veBackgroundTask değil) kullanarak, bunu birpath operation function parametresi olarak kullanmak ve gerisiniFastAPI’nin sizin için halletmesini sağlamak mümkündür; tıpkıRequest objesini doğrudan kullanırken olduğu gibi.

FastAPI’deBackgroundTask’i tek başına kullanmak hâlâ mümkündür; ancak bu durumda objeyi kendi kodunuzda oluşturmanız ve onu içeren bir StarletteResponse döndürmeniz gerekir.

Daha fazla detayıStarlette’in Background Tasks için resmi dokümantasyonunda görebilirsiniz.

Dikkat Edilmesi Gerekenler

Yoğun arka plan hesaplamaları yapmanız gerekiyorsa ve bunun aynı process tarafından çalıştırılmasına şart yoksa (örneğin memory, değişkenler vb. paylaşmanız gerekmiyorsa),Celery gibi daha büyük araçları kullanmak size fayda sağlayabilir.

Bunlar genellikle daha karmaşık konfigurasyonlar ve RabbitMQ veya Redis gibi bir mesaj/iş kuyruğu yöneticisi gerektirir; ancak arka plan görevlerini birden fazla process’te ve özellikle birden fazla server’da çalıştırmanıza olanak tanırlar.

Ancak aynıFastAPI app’i içindeki değişkenlere ve objelere erişmeniz gerekiyorsa veya küçük arka plan görevleri (email bildirimi göndermek gibi) yapacaksanız, doğrudanBackgroundTasks kullanabilirsiniz.

Özet

Arka plan görevleri eklemek içinpath operation function’larda ve dependency’lerde parametre olarakBackgroundTasks’i import edip kullanın.


[8]ページ先頭

©2009-2026 Movatter.jp