совместимость gevent с другими пакетами

Короче говоря, мой вопрос: как узнать, совместим ли какой-то конкретный пакет Python с gevent (по крайней мере, с gevent.monkey.patch_all)?

На самом деле мне было интересно, совместима ли библиотека https://github.com/benoitc/http-parser с gevent (будет ли она где-то блокировать все события или нет), но лучше иметь общий ответ.


person muodov    schedule 24.04.2014    source источник


Ответы (1)


Если библиотека, которую вы хотите использовать, создана с использованием чего-то, что исправляет gevent.monkey.patch_all(), то она вероятно сработает.

patch_all() заставит стандартную библиотеку хорошо работать с gevent. Например, модуль сокетов является частью стандартной библиотеки и исправлен patch_all() или patch_socket(), поэтому любая библиотека, построенная с использованием сокетов, вероятно, должна работать.

Похоже, что https://github.com/benoitc/http-parser использует модуль сокета и, следовательно, должен быть совместим с gevent. Единственный способ узнать наверняка — это проверить.

Вот пример теста, реализованного на примере http-parser github:

from gevent.monkey import patch_all; patch_all()
from gevent.socket import create_connection
import gevent
from http_parser.http import HttpStream
from http_parser.reader import SocketReader

def worker(n):
    try:
        s = create_connection(('gunicorn.org', 80))
        s.send("GET / HTTP/1.1\r\nHost: gunicorn.org\r\n\r\n")
        r = SocketReader(s)
        p = HttpStream(r)
        print "Worker {}, headers length: {}".format(n, len(p.headers()))
    finally:
        s.close()

if __name__ == '__main__':
    jobs = [gevent.spawn(worker, job_no) for job_no in range(10)]
    gevent.joinall(jobs)

Что выводит:

(test)msvalkon@Lunkwill:/tmp$ python test_http_parser.py 
Worker 8, headers length: 4
Worker 1, headers length: 4
Worker 5, headers length: 10
Worker 2, headers length: 10
Worker 9, headers length: 10
Worker 4, headers length: 10
Worker 3, headers length: 10
Worker 6, headers length: 10
Worker 7, headers length: 10
Worker 0, headers length: 10

Похоже, что http-parser соответствует gevent.

person msvalkon    schedule 24.04.2014
comment
Предупреждение для заинтересованных: http_parser оказался несовместимым с gevent при использовании с настройками по умолчанию. Дело в том, что у него есть две реализации: чистый Python (который поддерживает gevent) и C (который не поддерживает). http_parser пытается использовать второй, когда это возможно. В итоге я исправил http_parser/http.py, чтобы всегда импортировать pyparser - person muodov; 29.07.2014