Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 20, 2011 13:56:39

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

Есть какие-нибудь методики или библиотеки для создания “красоты” ассинхр. кода, а то там все колбеками обвешано.
Например что-нибудь на подобии fibers

Офлайн

#2 Сен. 20, 2011 13:58:09

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

o7412369815963, в Twisted это решается с помощью inlineCallbacks. По сути создается генератор.



Офлайн

#3 Сен. 20, 2011 19:02:20

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

А для tornado есть что-то подобное? Что-то ничего не нашел, сейчас попробую что нибудь с генератором придумать.

Офлайн

#4 Сен. 20, 2011 19:25:20

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

было так

    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 получать…

Офлайн

#5 Сен. 20, 2011 20:10:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

> терь надо придумать как результат от bar получать…
через yield можно получать результат и ексепшены

try:
result = yield foo()
exept MyExc:
pass
Оформлю - выложу готовый код

Офлайн

#6 Сен. 20, 2011 21:29:44

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

А для tornado есть что-то подобное? Что-то ничего не нашел, сейчас попробую что нибудь с генератором придумать.
Уже - есть недавно добавленный модуль gen - http://groups.google.com/group/python-tornado/browse_thread/thread/3c21e276579dd353



Офлайн

#7 Сен. 20, 2011 21:58:26

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

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()

Офлайн

#8 Сен. 20, 2011 22:25:07

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Методы написания асинхронных приложений

Гуд. сделал заметку
не так красиво, но все равно буду юзать штатное решение + там есть вызов группы методов и метод ожидания wait

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version