Если библиотека, которую вы хотите использовать, построена с использованием чего-то, что 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.
Предупреждение другим заинтересованным: ** http_parser оказался несовместимым с gevent при использовании с настройками по умолчанию **. Дело в том, что оно имеет две реализации: чистый Python (который поддерживает gevent) и C (а это не так). http_parser пытается использовать второй, когда это возможно. Я закончил с исправлением http_parser/http.py, чтобы всегда импортировать pyparser – muodov
@muodov хорошо знать! – msvalkon