python, tornado

Tornado ve coroutine’ler

Tornado ile uygulamamızı hazırlarken bazen genel asenkron fonksiyonlar yazmamız gerekiyor. örneğin:


BaseHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get_user_stats(self, user):
        ...
        stats = yield self.db.user_stats.find_one({"user_id": user})
        return stats

HedeHandler(BaseHandler):
    @tornado.web.asyncronius
    @tornado.gen.corotine
    def get(self, age):
        .....
        users = yield self.db.users.find({"age": age})
        while (yield users.fetch_next):
           user = users.next_obj()
           user_stats = self.get_user_stats(user["_id"])

Buradaki problem içerisinde yield kullandığımız bir method yada fonksiyon içerisinde ne yazık ki return deyimini kullanamayacak oluşumuz, bu kodu çalıştırmayı denediğimiz de python bize generator içerisinde return deyimi kullanamazsınız hatasını verecektir, fonksiyonun birden bire generator’e dönüşmesinin nedeni ise kullandığımız yield deyimi.

Bu problemi aşmak için tornado.gen paketi içerisinde bulunan Return exception’ınını kullanmamız gerekiyor, kodu yeniden düzenlediğimiz de ise son hali şöyle olacak.


BaseHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get_user_stats(self, user):
        # bu methodu bir kaç farklı yerde daha kullanıyoruz.
        stats = yield self.db.user_stats.find_one({"user_id": user})
        raise tornado.gen.Return(stats)

HedeHandler(BaseHandler):
    @tornado.web.asyncronius
    @tornado.gen.corotine
    def get(self, age):
        users = yield self.db.users.find({"age": age})
        while (yield users.fetch_next):
           user = users.next_obj()
           user_stats = yield self.get_user_stats(user["_id"])
           # user_stats la bişiyler yap

tornado coroutine içerisinde atılan exception’ları yakalayarak Return sınıfına ait bir exception olup olmadığını kontrol ediyor, eğer Return exception’ı ise sonucu alıp Future sınıfının set_result methoduna veriyor ve future nesnesi yield edilmek üzere return ediliyor. python3 de ise bu exception’a gerek yok, direk return kullanabiliyoruz.

Bu arada tornado çok güzel, gelsenize.

Standart

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s