使用gevent和grpc扩展问题

时间:2018-06-24 04:29:47

标签: grpc gevent

由于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

有关系吗?

1 个答案:

答案 0 :(得分:1)

在标准gRPC Python实现中,异步请求在后台线程上执行。由于GIL,纯Python程序无法获得与CPU绑定的任务的并发性,但是由于gRPC是基于c的库,因此许多gRPC工作可以同时完成。

启用gEvent会强制整个程序在单个线程上运行。您失去了上述并发性。此外,与c相对,在Python中处理IO会产生一些开销。

如果您的目标是最大化性能,建议您使用默认的gRPC实现。 gRPC gEvent主要用于兼容性。