Найти - Пользователи
Полная версия: Методы написания асинхронных приложений
Начало » Python для экспертов » Методы написания асинхронных приложений
1
o7412369815963
Есть какие-нибудь методики или библиотеки для создания “красоты” ассинхр. кода, а то там все колбеками обвешано.
Например что-нибудь на подобии fibers
regall
o7412369815963, в Twisted это решается с помощью inlineCallbacks. По сути создается генератор.
o7412369815963
А для tornado есть что-то подобное? Что-то ничего не нашел, сейчас попробую что нибудь с генератором придумать.
o7412369815963
было так
    def get(self):
self.foo0()
def foo0(self):
self.write("0")
self.bar(callback=self.foo1)
def foo1(self):
self.write("1")
self.bar(callback=self.foo2)
def foo2(self):
self.write("2")
self.finish()

def bar(self, callback):
self.write("-bar-")
callback()
стало так
    def get(self):
self.start(self.foo0)
def foo0(self):
self.write("0")
yield self.bar
self.write("1")
yield self.bar
self.write("2")
self.finish()

def bar(self, callback):
self.write("-bar-")
callback()
такой обработчик
    def start(self, func):
it = func()
cb = it.next()
cb(callback=self.async_callback(self.start2,it))

def start2(self, it):
try:
cb = it.next()
cb(callback=self.async_callback(self.start2,it))
except StopIteration:
pass
терь надо придумать как результат от bar получать…
o7412369815963
> терь надо придумать как результат от bar получать…
через yield можно получать результат и ексепшены
try:
result = yield foo()
exept MyExc:
pass
Оформлю - выложу готовый код
ziro
А для tornado есть что-то подобное? Что-то ничего не нашел, сейчас попробую что нибудь с генератором придумать.
Уже - есть недавно добавленный модуль gen - http://groups.google.com/group/python-tornado/browse_thread/thread/3c21e276579dd353
o7412369815963
ziro
А для tornado есть что-то подобное? Что-то ничего не нашел, сейчас попробую что нибудь с генератором придумать.
Уже - есть недавно добавленный модуль gen - http://groups.google.com/group/python-tornado/browse_thread/thread/3c21e276579dd353
Сейчас разберусь с ним, а я уже удобную оболочку для asyncmongo написал - вызов как в классическом + отлов ошибок через try..except
Подумал оформить и на джитхаб выложить…
    @tornado.web.asynchronous
@tornadoinline.inline_mongo
def get(self):
print 'start foo0'
self.write("start<br/>\n")

yield self.db.user.save({ 'login':'bill', 'level':0 })
self.write('save ok<br/>\n')

self.write("find")
try:
user = yield self.db.user.find_one({})
self.write(str(user) + '<br/>\n')
except tornadoinline.MongoError:
self.write('-error-')

self.write("finish")
self.finish()
o7412369815963
Гуд. сделал заметку
не так красиво, но все равно буду юзать штатное решение + там есть вызов группы методов и метод ожидания wait
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB