간단히 말해서, 내 질문은 : 특정 Python 패키지가 gevent (최소한 gevent.monkey.patch_all)와 호환되는지 어떻게 알 수 있습니까?gevent와 다른 패키지의 호환성
실제로 나는 http-parser 라이브러리가 gevent (모든 eventlet을 어딘가에 차단할지 여부)와 호환되는지 궁금 해서요. 그러나 일반적인 대답을 갖는 것이 더 좋을 것입니다.
간단히 말해서, 내 질문은 : 특정 Python 패키지가 gevent (최소한 gevent.monkey.patch_all)와 호환되는지 어떻게 알 수 있습니까?gevent와 다른 패키지의 호환성
실제로 나는 http-parser 라이브러리가 gevent (모든 eventlet을 어딘가에 차단할지 여부)와 호환되는지 궁금 해서요. 그러나 일반적인 대답을 갖는 것이 더 좋을 것입니다.
사용하려는 라이브러리가 gevent.monkey.patch_all()
패치를 사용하여 빌드 된 경우 일 가능성이 높으며 일 것입니다.
patch_all()
표준 라이브러리은 gevent와 잘 어울립니다. 예를 들어 소켓 모듈은 표준 라이브러리의 일부이며 patch_all()
또는 patch_socket()
으로 패치되므로 소켓 을 사용하여 빌드 된 모든 라이브러리는 아마도을 작동해야합니다.
http-parser은 소켓 모듈을 사용하므로 gevent와 호환되어야합니다. 확실히 알 수있는 유일한 방법은 테스트하는 것입니다.
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-파서 GitHub의의 예에서 구현 된 예를 테스트합니다.
관심있는 사람들에게 경고 : ** http_parser는 기본 설정 **을 사용할 때 gevent를 준수하지 않는 것으로 판명되었습니다. 것은 순수 파이썬 (gevent를 지원함)과 C (그렇지 않다)의 두 가지 구현을 가지고있다. http_parser는 가능한 경우 두 번째 것을 사용하려고 시도합니다. 나는 항상 pyparser – muodov
@muodov를 알기 좋은 http_parser/http.py를 패치하는 것으로 끝났다! – msvalkon