【问题标题】:Can I improve performance when using Python gRPC client stubs in more threads?在更多线程中使用 Python gRPC 客户端存根时可以提高性能吗?
【发布时间】:2020-12-07 22:39:17
【问题描述】:

假设我有一个 Python gRPC 服务器和一个相应的客户端。

根据Question,可以利用相同的 gRPC 通道将其传递给客户端存根,每个存根在不同的线程中运行。

假设 RPC 函数 foo() 从线程 T1 调用,响应大约需要一秒钟。我可以同时从线程 T2 调用foo(),而 T1 仍在等待线程中的响应,或者通道是否以某种方式锁定,直到第一个调用返回?换句话说:是否通过使用更多线程来提高性能,因为相应的服务器基于线程池并且能够“并行”处理更多请求,如果是,我应该为每个线程使用相同的通道还是不同的通道?

编辑:根据快速测试,使用来自不同线程的相同通道的并行请求似乎是可能的,并且以这种方式执行它很有意义。但是,因为在结束问题之前,我希望看到专家确认此代码是否正确:

import time
import threading
import grpc
import helloworld_pb2
import helloworld_pb2_grpc

def run_in_thread1(channel):

    n = 10000
    for i in range(n):
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='1'))
        print("client 1: " + response.message)

    
def run_in_thread2(channel):

    n = 10000
    for i in range(n):
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello2(helloworld_pb2.HelloRequest(name='2'))
        print("client 2: " + response.message)

if __name__ == '__main__':
    print("I'm client")
    channel = grpc.insecure_channel('localhost:50051')
    x1 = threading.Thread(target=run_in_thread1, args=(channel,))
    x1.start()
    x2 = threading.Thread(target=run_in_thread2, args=(channel,))
    x2.start()
    
    x1.join()
    x2.join()

【问题讨论】:

  • 是的,一个gRPC通道其实就相当于一个连接池。理想情况下,您应该为每个客户端只创建一个通道,并从中创建多个存根。当您对这些存根进行 rpc 调用时,它们将导致在同一通道上创建新的流。你在做什么对我来说听起来很合理。

标签: python python-3.x multithreading grpc grpc-python


【解决方案1】:

gRPC 使用 HTTP/2,可以在一个连接上多路复用多个请求,并且 gRPC 客户端连接应在客户端应用程序的整个生命周期内重复使用。

如果您在使用数据库时受到启发,我想说您不必担心它,因为使用 gRPC 时不存在打开连接开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多