2014-04-24 2 views
3

Вкратце, мой вопрос: как узнать, когда какой-либо конкретный пакет Python совместим с gevent (по крайней мере, с gevent.monkey.patch_all)?Совместимость gevent с другими пакетами

На самом деле мне было интересно, совместима ли библиотека http-parser с gevent (она будет блокировать все флажки событий или нет), но общий ответ будет лучше.

ответ

2

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

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

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

Вот пример тест, реализованный на примере HTTP-парсер 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)[email protected]:/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.

+1

Предупреждение другим заинтересованным: ** http_parser оказался несовместимым с gevent при использовании с настройками по умолчанию **. Дело в том, что оно имеет две реализации: чистый Python (который поддерживает gevent) и C (а это не так). http_parser пытается использовать второй, когда это возможно. Я закончил с исправлением http_parser/http.py, чтобы всегда импортировать pyparser – muodov

+0

@muodov хорошо знать! – msvalkon