Как стать автором
Обновить

Комментарии 19

27 июля 2014 — 03 августа 2014?

Из черновиков выпал?
Да, после моего бана тут на хабре, забыл опубликовать пост обратно, решил вернуть его.
НЛО прилетело и опубликовало эту надпись здесь
Самое веселое — у него тот же Flask-Admin, но без батареек.
Выпуск старый, просто достал его из черновиков, ибо люди спрашивали о нем в ЛС, все свежие выпуски пока только на нашем сайте
а где ещё публикуете свежие выпуски?
Только у нас на сайте, за ссылкой лучше в ЛС обратитесь
Планируете свежие выпуски выкладывать на хабре? Или теперь только на своей площадке?
Планируем, но скорей всего на хабре будут подборки 1 раз в месяц самых вкусных новостей за этот период, если концепцию до конца проработаем то с октября и начнем постить
Как-то я в прошлый раз пропустил статью про gevent. Кто с ним знаком, расскажите, пожалуйста, как он умудряется (в сравнении с asyncio) асинхронно работать без декораторов и yield'ов?

import asyncio

@asyncio.coroutine
def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    yield from asyncio.sleep(1.0)
    return x + y

@asyncio.coroutine
def print_sum(x, y):
    result = yield from compute(x, y)
    print("%s + %s = %s" % (x, y, result))

loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()


import gevent

def compute(x, y):
    print "Compute %s + %s ..." % (x, y)
    gevent.sleep(1.0)
    return x + y

def print_sum(x, y):
    result = compute(x, y)
    print "%s + %s = %s" % (x, y, result)

print_sum(1, 2)


И, главное, почему в asyncio, который разрабатывался позже и на уровне Гвидо, не сделано так же?
Потому что gevent основан на серой магии greenlet.
Которая имеет свои подводные камни и особенности, и никогда не войдет в стандартную библиотеку.
Gevent заменяет python-потоки и некоторые ресурсоемкие операции своими аналогами (которые работают на libevent), из-за этого перед запуском программы нужно выполнить манки-патчинг.

Asyncio же является полноценной библиотекой, соответственно подход более традиционный, через декораторы и функции.
libevent -> libev
ресурсоемкие -> блокирующие ввод-вывод (IO bound)
gevent заменяет блокирующие методы возвратом управления в планировщик green thread-ов, где выставляется ожидание вида «разбудить этот поток, когда случится вот это». точно это распространяется на сокеты, таймауты, блокирующий get из очередей, ожидание завершения другого green thread. возможно, файловое i/o.

для возможности использования green thread-ов вообще, gevent дичайше издевается над интерпретатором, а для перехвата вызовов идет манкипатчинг. в stdlib такое не пускают.
Всегда было любопытно, чем Gevent отличается от Stackless в плане работы с userspace thread'ами.
Я, к сожалению, не знаю точно, но предположу, что мало чем. Сам по себе gevent — обертка над greenlet + libev.

>> pypi.python.org/pypi/greenlet
>> The greenlet package is a spin-off of Stackless, a version of CPython that supports micro-threads called «tasklets».
>> There are several libraries that use Greenlet as a more flexible alternative to Python's built in coroutine support:
>>…
>> gevent
>>…

В итоге, это выглядит примерно как stackless к которому прикрутили libev.
Почти ничем не отличается — gevent использует greenlet, который является выдранным hard switching mode из stackless.

Единственное, но очень важное отличие между stackless и greenlet — у stackless есть soft switching который сильно быстрее и сильно надежнее.

Вот тут есть немного: www.stackless.com/pipermail/stackless/2009-September/004268.html
1. Не используйте, пожалуйста, термин «планировщик green thread-ов» — такого объекта в gevent не существует.
2. Файловое i/o не имеет неблокирующей реализации в gevent — потому что linux kernel такое не умеет.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.