在使用python grpc服务器时,
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
这是实例化grpc服务器的一般方式。但是在运行时,如果我尝试运行10个以上的客户端实例,它需要服务器流,第11个实例不能工作(我正在运行10个连接到这个服务器并获取流的客户端实例)
即使我将max_workers更改为None,它创建的最大线程也是40个(根据文档,8个核心x 5个),因此在这种情况下,最多可以同时为40个客户端提供服务。
这是预期的行为吗?
我正在编写我的代码,但尝试使用这里记录的通用grpc python代码:
https://grpc.io/docs/tutorials/basic/python.html
我可以用这个重现同样的问题。
要重现它,只需在max_workers= 4的一个窗口中运行route_guide_server.py,然后尝试在不同的窗口中运行4-5个不同的客户端。第4个客户端将不得不等待,直到其中一个客户端完成。(要获得更好的视图,请在yield中添加一个time.sleep )
如果大量的客户端(100和1000个客户端)想通过流(应该是连续的)访问python中的grpc服务器,那么更多的客户端将永远得不到机会。
发布于 2019-03-27 03:15:12
是的,这是预期的行为。
在运行我自己的测试代码之后,是的,如果您为max_workers提供了一个参数None,那么最大值为40。但是,如果我将最大值设置为100,那么我肯定最多可以有100个并发工作进程。这应该是预期的行为,因为线程池是基于请求的工作线程数创建的。您不能期望,如果您不提供一定数量的最大工作进程,那么它将在运行时进行扩展和缩减。除非更改grpc和并发期货线程池。按照接口耦合的方式,在python grpc中,我们现在必须使用并发未来线程池,所以如果我们想要它大于40,我们必须向max_workers提供一个参数,并且它必须在编译时设置。
https://stackoverflow.com/questions/55338451
复制相似问题