由于gevent / grpc兼容性问题已得到修复,我试图使用它 .
我用一个示例脚本测试了它
from gevent import monkey
monkey.patch_all()
import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()
import grpc
import time
import sys
channel = grpc.insecure_channel('localhost:5000')
stub =hello_word_pb2_grpc.HelloWordStub(channel)
data = hellow_word_pb2.HelloWorld()
num_requests=3000
start=time.time()
futures = []
# Make async requests
for i in range (num_requests):
futures.append(stub.HelloWorld.future(req))
# Wait for the requests to complete
for i in range (num_requests):
try:
result = futures[i].result()
# Do something with the result
except Exception as e:
print(e)
end = time.time()
print(end - start)
现在没有这个补丁
import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()
完成3000个req需要0.456701040268秒
现在有补丁
import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()
需要1.06秒 .
任何有关兼容性补丁可能出错的建议 .
显然,如果我将reqs的数量减少到1000并且在每次调用中使用1000个异步req进行3次调用,则总计3000个req所需的时间小于1.06 . 但我想知道导致修补的原因是什么?
我在这里发现了类似的东西 - https://github.com/grpc/grpc/blob/master/src/python/grpcio_tests/commands.py#L115
它有关系吗?
1 回答
在标准的gRPC Python实现中,异步请求在后台线程上执行 . 由于GIL,纯Python程序无法获得CPU绑定任务的并发性,但由于gRPC是基于c的库,因此很多gRPC工作都可以同时完成 .
启用gEvent会强制整个程序在单个线程上运行 . 你失去了上面提到的并发性 . 此外,与c相比,在Python中处理IO有一些开销 .
如果您的目标是最大化性能,我建议使用默认的gRPC实现 . gRPC gEvent主要用于兼容性 .