1

在使用 python grpc 服务器时,

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

这是 grpc 服务器实例化的一般方式。但是在这个运行中,如果我尝试运行超过 10 个 client 实例,它期望服务器流式传输,第 11 个实例不起作用(我正在运行 10 个连接到该服务器并获取流的 client 实例)

即使我将 max_workers 更改为 None,它创建的最大线程数是 40 个线程(根据文档,8 个内核 x 5),因此在这种情况下最多可以同时为 40 个客户端提供服务。
这是预期的行为吗?

我正在处理我的代码,但尝试使用此处记录的通用 grpc python 代码:

https://grpc.io/docs/tutorials/basic/python.html

我可以用这个重现同样的问题。

要重现它,只需route_guide_server.py在 max_workers= 4 的一个窗口中运行,然后尝试在不同的窗口中运行 4-5 个不同的客户端。第 4 个客户必须等到其中一个客户完成。(为了获得更好的视图,在 yield 中添加 time.sleep)

如果大量客户端(100 和 1000 多个客户端)想通过流(应该是连续的)访问 python 中的 grpc 服务器,那么客户端将永远没有机会。

4

1 回答 1

1

是的,这是预期的行为。

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

于 2019-03-26T19:15:11.820 回答