Pull to refresh

Проекты Python в рамках Google Summer of Code — gevent

Reading time2 min
Views8.7K
Уже весна, а это значит… что скоро лето и очередное Google Summer of Code — возможность получить кучу опыта и даже какое-то материальное вознаграждение. Хочу рассказать об одном интересном проекте, которому вы сможете помочь во время летних каникул — gevent.

gevent — это библиотека для Python, которая позволяет вам писать асинхронные сетевые приложение использую синхронный API. Как вы уже догадались, она использует для этого greenlet'ы. Поясню вышесказанное на следующем примере кода (взятого из официального репозитория проекта на bitbucket):

"""Spawn multiple workers and wait for them to complete"""

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey
monkey.patch_all()

import urllib2

def print_head(url):
    print 'Starting %s' % url
    data = urllib2.urlopen(url).read()
    print '%s: %s bytes: %r' % (url, len(data), data[:50])

jobs = [gevent.spawn(print_head, url) for url in urls]
gevent.joinall(jobs)

Основная прелесть этого кусочка кода в том, что все запросы на получение страниц с помощью вызова urllib2.urlopen выполняются параллельно. Аналогичный трюк можно проделать с любой библиотекой, которая использует модуль socket. Заинтригованы? У меня даже получалось использовать в приложениях, написанных с использоваием gevent, такие мощные библиотеки как SQLAlchemy (конечно необходимо использовать DB-API 2.0 адаптеры с python-сокетами). Резюме — читаемый код, который выполняет асинхронный I/O и никаких коллбэков (вы помните Twisted?), который к тому же выполняется быстро. Почему я утверждаю, что быстро? Потому что «под капотом» у gevent — Libevent — быстрая и проверенная временем библиотека, предоставляющая цикл обработки событий (event loop), который находится полностью в С коде. А в добавок в Libevent есть DNS-резольвер и HTTP-сервер, что gevent использует наполную (модули gevent.dns, gevent.http). Убедиться в скорости gevent можно, например, пройдя по ссылке и посмотрев результаты бенчмарков среди WSGI-серверов, написанных на Python.

А теперь конкретно об идеях на GSoC для gevent, а их пока только две, что впрочем не мешает вам предлагать свои:
  • Портирование gevent для использования со Stackless Python.
  • Реализация в gevent циклов обработки событий (event loops) отличных от libevent.

Как вы знаете, модуль greenlet, который используется в gevent, это всего лишь «выжимка» из Stackless Python. И почему бы gevent не заставить работать вместе со Stackless Python. Во-первых, для последнего ещё нету качественной библиотеки, реализующей неблокирующие сокеты, и если она появится, пользователи Stackless Python будут вам очень благодарны. Во-вторых, «микропотоки» (tasklets) Stackless Python работают быстрее чем гринлеты, что даст немалый прирост скорости в приложениях, написанных с gevent.

Насчёт реализации циклов обработки событий просто приведу свои мысли:
  • Интеграция цикла gevent с циклами GUI-библиотек (pygtk, PyQt4).
  • Nginx mod_wsgi предоставляет API к своему poll-интерфейсу, который можно использовать для реализации цикла gevent — только представьте — nginx как сервер асинхронных python-приложений. По-моему, звучит классно.

Если вам стало интересно, подписывайтесь на официальный список рассылки gevent, там как раз только начинается обсуждение проектов GSoC.
Tags:
Hubs:
+24
Comments24

Articles

Change theme settings