gevent与其他软件包的兼容性

时间:2014-04-24 19:51:19

标签: python compatibility gevent

简而言之,我的问题是:我如何知道某个特定的Python包与gevent兼容(至少与gevent.monkey.patch_all兼容)?

实际上我想知道http-parser库是否与gevent兼容(它是否会阻止所有的eventlet),但是得到一般答案会更好。

1 个答案:

答案 0 :(得分:2)

如果您要使用的库是使用gevent.monkey.patch_all()补丁构建的,那么它可能可以工作。

patch_all()会让标准库在gevent中发挥出色。例如,套接字模块是标准库的一部分,并由patch_all()patch_socket()进行修补,因此使用套接字构建的任何库都可能正常工作

似乎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。