grpc-Python max_workers限制并发进程数

时间:2019-03-25 13:04:03

标签: python multithreading grpc grpc-python

在使用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服务器(应该是连续的),那么客户端将永远没有机会。

1 个答案:

答案 0 :(得分:1)

是的,这是预期的行为。

运行我自己的测试代码后,是的,如果您向max_workers提供None的参数,则最大值为40。但是,如果我将最大值设置为100,那么可以肯定的是,我最多可以有100个并发工作器。这应该是预期的行为,因为基于请求的工作程序数创建了线程池。您不能期望,如果您不提供大量的最大工人数,那么它只会在运行时按比例扩大和缩小。并非没有改变grpc和并发期货线程池。通过接口的耦合方式,现在在python grpc中,我们必须使用并发的Futures线程池,因此如果我们希望它大于40,则必须向max_workers提供参数,并且必须在编译时设置。