在使用python grpc服务器时,
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
这是实例化grpc服务器的一般方法。但是运行此命令后,如果我尝试运行超过10个的client实例(需要服务器流),则第11个实例将不起作用(我正在运行10个连接到该服务器并获取流的client实例)
这是正常行为吗?因为即使我将max_workers更改为None,它创建的max线程数也最多为40个(每个文档8个内核x 5),因此在这种情况下最多可以同时为40个客户端提供服务。
即使我将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个不同的客户端。第四位客户将不得不等到一位客户完成。(要获得更好的视图,请在产量中增加一个时间。)
如果大量客户端(100到1000个客户端)希望通过流式访问python的grpc服务器(应该是连续的),那么客户端将永远没有机会。
答案 0 :(得分:1)
是的,这是预期的行为。
运行我自己的测试代码后,是的,如果您向max_workers提供None的参数,则最大值为40。但是,如果我将最大值设置为100,那么可以肯定的是,我最多可以有100个并发工作器。这应该是预期的行为,因为基于请求的工作程序数创建了线程池。您不能期望,如果您不提供大量的最大工人数,那么它只会在运行时按比例扩大和缩小。并非没有改变grpc和并发期货线程池。通过接口的耦合方式,现在在python grpc中,我们必须使用并发的Futures线程池,因此如果我们希望它大于40,则必须向max_workers提供参数,并且必须在编译时设置。