gevent与其他包的兼容性
简单来说,我的问题是:我怎么知道某个特定的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 兼容的。