Ana Sayfa Slider Blog Python Son Dakika

Python’da Asenkron Programlama

Merhabalar bu yazımda asenkron programlama nedir, nasıl çalışır, senkron asenkron ve multithread programlama arasındaki farklar nelerdir bunlardan bahsedeceğim.

Asenkron Programlama

Asenkron (eş zamansız) programlamadan önce senkron(eşzamanlı) programlama nedir biraz buna değinmek istiyorum. Senkron programlama bir uygulamada akışın sıralı bir şekilde işleme alındığı programlama türüdür. Örneğin bir işe alım süreci düşünürsek öncelikle kişisel belgeler incelenir bu aşamada uygun görülen kişiler ile mülakat yapılır ve en sonunda işe alınacak kişiler belirlenir. Burada belli bir sıra ile ilerleme söz konusudur.

Asenkron programlama (eş zamansız programlama) ise bir uygulamada ana akışta meydana gelebilecek gecikmelerde akışın bozulmamasını ve akışın devam etmesini sağlayan programlama türüdür. Bu tür için aynı örnek üzerinden gidersek bir işe başvurulduğunda oradaki sürecin sonuçlanması beklenmeden başka bir şirkete de başvuru yapılabilir. Burada dikkatinizi çekmek istediğim şey iş arayış sürecinde yeni başvuru yapmak için daha önce yapılan başvuruların sonuçlanması beklenmeden yeni başvuru yapılabilmesi ve yeni yapılan başvurunun iş arayış sürecini etkilememesidir.

 

Yukarıdaki görsele baktığımızda uzun siyah çizgiler bize programın zaman akışını vermektedir. Senkron programlamada bir istek için yanıt verilmezse diğer bir istek gönderilemez. Asenkron programlamada ise bir istek gönderilir ve sonrasında yanıtın gelmesi beklenmeden yeni bir istek daha gönderilebilir. İsteklere verilecek yanıtlar hazırlandığında program akışına dahil olurlar.

Asenkron programlama nasıl çalışır ?

Bilgisayar sisteminde çalışan programımızın süreç işlemlerine baktığımızda ise senkron programlamada bir işlem sonuçlanmadan diğer bir işleme başlanamaz. Asenkron programlamada ise tahmin ettiğiniz gibi bir işlem sonuçlanmadan diğer bir işlem başlayabilir. Örneğin bir kargonuz var ve bunu göndermek için kargo şirketine gittiniz. Giriş kapısından girdikten sonra herkesin kargo bilgilerini kağıda yazdığını görürsünüz ve sizde bir kağıt alır doldurursunuz. Burada kağıdı doldurmak için bir sıra yoktur ve kimsenin kağıdını doldurmasını beklemek zorunda değilsinizdir. Fakat kargoyu işleme almak için bir sıra vardır ve sıra size gelene kadar beklemek zorundasınızdır.

Yukarıdaki resmin sol tarafındaki şekil senkron programlamanın sistemdeki çalışma şeklini göstermektedir. Burada İ1 diye ifade edilen birinci işlemdir. İ2 diye ifade edilen ise ikinci işlemdir. Senkron programlamada görüldüğü gibi birinci işlem tamamlanmadığı için ikinci işlem beklemektedir. Sağ taraftaki şekil ise asenkron programlamanın sistemdeki çalışma şeklini göstermektedir. Burada ise birinci işlem tamamlanmamasına rağmen diğer işlemin başladığı görülmektedir.

Multithread Programlama ile Asenkron Programlama arasındaki fark nedir ?

Multithread programlama, bir programda işlemlerin birbirinden bağımsız olarak çalıştığı paralel programlama türüdür. Multithread programlamada sistem her bir işlem için ayrı bir işlem yolu belirler.

Yukarıdaki resimde görüldüğü gibi sistem her bir işlem için ayrı bir yol izlemektedir. Bunun yanı sıra her sistemin bir kapasitesi vardır ve bu yollarda kapasiteye bağlı olarak bir sınıra kadar oluşabilmektedir. Bu sınıra ulaşıldığında sistem senkron programlamada olduğu gibi işlemlerden birinin bitmesini beklemek zorundadır. Asenkron programlamada bazı durumlarda multithread programlamaya benzer bir kullanım görülebilmektedir fakat bu sistem tarafından belirlenir. Burada anlatmak istediğim asenkron programlamada işlemlerin çoğalmasından dolayı sistem işlemleri multithread programlamada olduğu gibi farklı yollara ayırabilir.

Hangi programlama türü daha iyidir?

Bu sorunun cevabı programınızdaki işlemlere bağlı olarak değişebilmektedir. Örneğin sıralı bir işlem yapacaksanız ve programda akışı bozacak bir durum yoksa senkron programlamayı tercih edebilirsiniz. Programınızda bir işlemin uzun süreceğini ve akışı bozacağını düşünüyorsanız burada asenkron programlama kullanabilirsiniz. Programınızı iki farklı program gibi çalıştırmak istiyorsanız multithread programlamayı tercih edebilirsiniz. Örneğin programınız bir yandan video kaydı yaparken diğer yandan arka planda sizin ses kaydınızı yapacaksa multithread programlamayı kullanabilirsiniz.

Performans boyutundan baktığımızda ise bu da programınıza bağlı olarak değişebilmektedir. Bazı durumlarda senkron programlama bazı durumlarda asenkron programlama bazı durumlarda ise multithread programlama daha performanslı çalışabilir. Örneğin program akışında gecikmelerin olduğunu varsayalım. Burada asenkron programlama senkron programlamaya göre daha performanslı çalışır.

Örnek Kod

Yukarıda verdiğim iş arama süreci örneğini python da yazalım.

Not: Bu örnek konunun daha iyi anlaşılabilmesi için verilmiştir. Konuyu anladıktan sonra kendi programlarınızı daha uygun bir şekilde yazabilirsiniz.

Öncelikle asenkron programlama için yazılmış asyncio kütüphanesini içe aktarıyoruz.

import asyncio

Örneğimize göre asenkron olarak başvurabileceğimiz şirketler ve şirketlerin başvuruları değerlendirdiği bir süreç var. Her bir şirketi bir fonksiyon olarak tanımlayalım.

async def sirket_1(cv):
    await asyncio.sleep(1)
    print(f”Şirket 1 : {cv} değerlendirmeye alındı.”)
    await asyncio.sleep(4)
    print(“Şirket 1 : Değerlendirme olumsuz sonuçlandı.”)

Yukarıdaki fonksiyon bir şirketin iş başvurularını değerlendirme sürecini kapsamaktadır. Bir fonksiyonu asenkron yapmak için başına “async” anahtarını yazmamız gerekmektedir. Sonrasında “await” fonksiyonu ile programa gecikmenin olabileceğini bildiriyoruz. Burada “await asyncio.sleep(1)” programın bir saniye beklemesi gerektiğini belirtiyor. Biz bu programda beklemeleri gün olarak hesaplayacağız ve burada şirketin gerekli işlemleri yaptığını farzedeceğiz.

async def sirket_2(cv):
    await asyncio.sleep(3)
    print(f”Şirket 2 : {cv} değerlendirmeye alındı.”)
    await asyncio.sleep(4)
    print(“Şirket 2 : Tebrikler mülakat sürecine geçtiniz.”)
    await asyncio.sleep(3)
    print(“Şirket 2 : Tebrikler işe alındınız”)

async def sirket_3(cv):
    await asyncio.sleep(6)
    print(f”Şirket 3 : {cv} değerlendirmeye alındı.”)
    await asyncio.sleep(2)
    print(“Şirket 3 : Tebrikler mülakat sürecine geçtiniz.”)
    await asyncio.sleep(4)
    print(“Şirket 3 : Değerlendirme olumsuz sonuçlandı.”)

Diğer iki fonksiyona baktığımızda ise ilk fonksiyonda olduğu gibi bir şirketin iş başvurularını değerlendirme sürecini kapsamaktadır. Şirket 2 ‘de sürecin tamamının olumlu olduğu durum senaryosu vardır. Şirket 3 de ise sürecin mülakat sonrasında olumsuz olarak sonuçlandığı durum senaryosu vardır.

async def main(pdfFile):
    task1 = asyncio.create_task(sirket_1(pdfFile))
    task2 = asyncio.create_task(sirket_2(pdfFile))
    task3 = asyncio.create_task(sirket_3(pdfFile))
    await task1
    await task2
    await task3

Her bir şirkete yeni bir başvuru yapmak için oluşturduğumuz asenkron main fonksiyonu “asyncio.create_task(sirket_fonksiyonu)” aracılığı ile tüm şirketlere başvurmak için bir görev oluşturur. Sonrasında “await” anahtarı ile her bir görevi asenkron bir şekilde çalıştırarak şirketlere başvurular yapılır ve süreci tamamlanan işlemlerin sonuçları programa gönderilir.

if __name__ == ‘__main__’:
    pdfFile=”cv.pdf”
loop = asyncio.get_event_loop()

    loop.run_until_complete(main(pdfFile))
    loop.close()

Son olarak işlemin çalışmasını başlatmak için programın main fonksiyonu çalıştırılır. Burada cv dosyamızın bulunduğu konumu asenkron olan main fonksiyonumuza göndererek işlemlerin tamamlanmasını bekleriz. “loop = asyncio.get_event_loop()” sistemin işlem bilgilerini aldığı kısımdır. “loop.run_until_complete(main(pdfFile))” asenkron olan main fonksiyonu işleminin tamamlanana kadar çalışacağını belirtmektedir.

Programı çalıştırdığımızda program çıktısı yukarıdaki gibi olacaktır. Burada görüldüğü gibi farklı şirketler ile ilgili geri dönüşler farklı zamanlarda oluşmuştur.

Konunun anlaşılabilmesi için basit bir şekilde anlatmaya çalıştım umarım anlatabilmişimdir. Okuduğunuz için teşekkür ederim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir