在更多线程中使用 Python gRPC 客户端存根时,我可以提高性能吗?
Can I improve performance when using Python gRPC client stubs in more threads?
假设我有一个 Python gRPC
服务器和一个相应的客户端。
根据这个 Question 可以利用相同的 gRPC 通道传递给客户端存根,每个 运行 在不同的线程中。
假设 RPC 函数 foo()
是从线程 T1 调用的,响应大约需要一秒钟。我能否同时从线程 T2 调用 foo()
,而 T1 仍在等待线程中的响应,或者通道是否以某种方式锁定,直到第一次调用 returns?换句话说:是否通过使用更多线程来提高性能,因为相应的服务器基于线程池并且能够“并行”处理更多请求,如果是,我应该为每个线程使用相同的通道还是不同的通道?
编辑:根据快速测试,似乎可以使用来自不同线程的相同通道的并行请求,并且以这种方式进行是有意义的。但是,因为在关闭问题之前,我想看看专家确认这段代码是否正确:
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 使用 HTTP/2 并且可以在一个连接上多路复用多个请求,并且 gRPC 客户端连接在客户端应用程序的生命周期内应该是 re-used。
如果您在使用数据库时受到启发,我会说您不必担心它,因为在使用 gRPC 时不存在打开连接开销。
假设我有一个 Python gRPC
服务器和一个相应的客户端。
根据这个 Question 可以利用相同的 gRPC 通道传递给客户端存根,每个 运行 在不同的线程中。
假设 RPC 函数 foo()
是从线程 T1 调用的,响应大约需要一秒钟。我能否同时从线程 T2 调用 foo()
,而 T1 仍在等待线程中的响应,或者通道是否以某种方式锁定,直到第一次调用 returns?换句话说:是否通过使用更多线程来提高性能,因为相应的服务器基于线程池并且能够“并行”处理更多请求,如果是,我应该为每个线程使用相同的通道还是不同的通道?
编辑:根据快速测试,似乎可以使用来自不同线程的相同通道的并行请求,并且以这种方式进行是有意义的。但是,因为在关闭问题之前,我想看看专家确认这段代码是否正确:
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 使用 HTTP/2 并且可以在一个连接上多路复用多个请求,并且 gRPC 客户端连接在客户端应用程序的生命周期内应该是 re-used。
如果您在使用数据库时受到启发,我会说您不必担心它,因为在使用 gRPC 时不存在打开连接开销。