gevent与其他包的兼容性

3 投票
1 回答
946 浏览
提问于 2025-04-18 04:08

简单来说,我的问题是:我怎么知道某个特定的Python包是否和gevent兼容(至少是和gevent.monkey.patch_all兼容)?

其实我在想http-parser这个库是否和gevent兼容(它会不会在某个地方阻塞所有的事件处理),不过如果能有一个通用的答案就更好了。

1 个回答

2

如果你想用的库是用一些被 gevent.monkey.patch_all() 修改过的东西做的,那么它很可能可以正常工作。

patch_all() 会让 标准库 和 gevent 更好地配合。例如,socket 模块是标准库的一部分,它会被 patch_all()patch_socket() 修改,所以任何使用 sockets 的库应该也能正常工作

看起来 http-parser 使用了 socket 模块,因此应该和 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 兼容的。

撰写回答