Flask Asenkron – Async – Programlama

Flask-Mvc yazı dizisinde Flask http sunucusunun (werkzeug) async kabiliyeti olmadığını yazmıştık. Bu kısmen doğru çünkü werkzeug default ayarlarında async çalışamıyor. Fakat werkzeug sayesinde async kabiliyeti kazandırabiliyoruz. Async nedir bilmeyenler için aşağıda bir açıklama yapalım.

Async nedir?

Threadların oluşması olarak bakarsak yanlış bir yönlendirme olur. Async demek aslında uzunca süren bir işlemin bitmesini beklemeden diğerinin açılabilmesi demektir. Async açıklaması yaparken Concurrent(Eşzamanlı) ifadesini de kullanabiliriz. Yani aynı zamanda paralelel olarak n tane threadın açılabilmesi veya ilgili metodun n kere non-stop olarak çağrılabilmesi demek oluyor.

Şimdi flask’ı async hale nasıl getirebiliriz buna bakalım.

Öncelikle default flask app’si nasıl ayağa kaldırılıyor onu yazalım.

app.run(host='localhost', port=800, debug=True)

Evet yukarda satırlar bir flask applicasyonu ayağa kalkmış oldu.

def index():
  print("started")

Yukardaki şekilde bir metodumuz olduğunu varsayalım. Bu metodu her çağırdığımızda bir cevap alacaksınız. İlk baştan flask async değildi diyebilirsiniz fakat durum aslında tam olarak öyle değil. Yukardaki ifadede herhangi bir bekleme olmadığından isterseniz aynı anda 10 kere çağırın ard arda metodun çalıştığını göreceksiniz (bu işlem için soap ui test suit kulanabilirsiniz). Peki async olmadığını nasıl ispat edebilriz. Metodu güncelleyelim.

def index():
  print("started")
  time.sleep(10)

Evet yukardaki şekilde metodu güncellediğimizde requesti ard arda gönderdiğimizde artık bir request bitmeden yani 10 sn. geçmeden ekrana started yazmadığını göreceksiniz. Async olmadığını kanıtladığımıza göre artık Async nasıl çalışır ona bakalım.

app.run(host='localhost', port=800, debug=True)

werkzeug http sunucusuna bu şekilde gittiğimizde sunucu debug=true olarak çalışacaktır. Debug true olması durumunda, werkzeug satırları debug edebilmemiz için sync olarak çalıştırıyor. Bu nedenle, debug=True parametresini False yapmamız gerekli. Metodu tekrar çağıralım. Fakat durum değişmedi hala. 10 sn bekledikten sonra diğer requeste geçiyor olduğunu göreceksiniz. Werkzeug’a ait parametreleri incelediğimizde threaded adında bir parametre olduğunu göreceksiniz. Werkzeug aksi belirtilmedikçe bu parametreyi false olarak getiriyor. Söz diziminin son hali şöyle oluyor

app.run(host='localhost', port=800, debug=False, threaded=True)

Evet application yukardaki gibi başlatıldığında async olarak çalışmaya başlayacak ve bir request bitmeden (10 sn) diğer request başlayacak ve her çağırdığınızda console’a start yazısını yazacaktır. Bu sayede flask bir P.O.C. framework olmaktan çıkıyor ve product olarak kullanabileceğimiz bir framework haline gelmiş oluyor. Sonraki yazılarda görüşmek üzere. Selametle.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.