【问题标题】:grpc-Python max_workers limiting number of simultaneous processesgrpc-Python max_workers 限制同时进程的数量
【发布时间】:2019-08-15 17:35:08
【问题描述】:

在使用 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

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

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

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

【问题讨论】:

    标签: python multithreading grpc grpc-python


    【解决方案1】:

    是的,这是预期的行为。

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

    【讨论】:

    • 嗨,凯文,感谢您的回答。在这方面我想问两件事:1)这只是python grpc的行为吗?就像在其他 grpc 实现中一样,我没有看到这样的东西(我们不需要指定线程数)。那么,这是否意味着它会在那些 grpc 实现中自动扩展? 2)如果python grpc就是这种情况,有什么方法可以扩展它以进行生产吗?假设最初有 100-200 个客户端连接,但后来,如果突然创建了大约 5000-7000 个客户端,那么应用程序将失败,对吗?
    • 好问题。不幸的是,我目前没有将 grpc 用于 Python 以外的任何东西。如果我很快有时间,我可以尝试在 go 中做一些事情来测试你的问题,但是因为 go 非常专注于并发并且 goroutine 使用如此少的内存,所以如果 go grpc 确实自动扩展,我一点也不感到惊讶。 Python 线程使用的 OS 线程的内存要多几个数量级。扩大规模是非常可能的,但它可能会很快变得复杂。例如,您可以使用负载平衡,当其他 grpc 服务器准备好启动时......
    • 检测到线程池中的所有线程都在使用中。 grpc python 确实有反射,所以我确信有一些方法可以使用 grpc python 查看剩余的线程数,或者自己跟踪它。您可以创建一个系统来按需启动新的 grpc 服务器。如果您的要求允许,您可以使其更简单并关闭所有当前连接,启动具有更多线程的新服务器。对于许多应用程序来说,这是不可接受的。在 python grpc 路线图中,他们计划支持 asyncio,这可能会使这个问题变得没有意义。
    猜你喜欢
    • 2019-12-23
    • 2017-03-22
    • 2014-06-07
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多