首页 文章

使用gevent和grpc扩展问题

提问于
浏览
0

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

  • 1

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

    启用gEvent会强制整个程序在单个线程上运行 . 你失去了上面提到的并发性 . 此外,与c相比,在Python中处理IO有一些开销 .

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

相关问题