由于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次请求需要0.456701040268秒
现在有补丁
import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()
需要1.06秒。
任何建议都可能导致兼容性补丁出问题。
很明显,如果我将请求数减少到1000,并在每个呼叫中进行3个具有1000个异步请求的呼叫,则总共3000个请求所花费的时间少于1.06。但是我想知道是什么原因导致修补程序变得如此缓慢?
我发现这里提到了类似的内容-https://github.com/grpc/grpc/blob/master/src/python/grpcio_tests/commands.py#L115
有关系吗?
答案 0 :(得分:1)
在标准gRPC Python实现中,异步请求在后台线程上执行。由于GIL,纯Python程序无法获得与CPU绑定的任务的并发性,但是由于gRPC是基于c的库,因此许多gRPC工作可以同时完成。
启用gEvent会强制整个程序在单个线程上运行。您失去了上述并发性。此外,与c相对,在Python中处理IO会产生一些开销。
如果您的目标是最大化性能,建议您使用默认的gRPC实现。 gRPC gEvent主要用于兼容性。