【问题标题】:What the purpose of ThreadPoolExecutor in grpc server?grpc 服务器中 ThreadPoolExecutor 的目的是什么?
【发布时间】:2019-03-27 08:30:35
【问题描述】:

当我们实例化 gRPC 服务器时,我们将 ThreadPoolExecutor 传递给它的构造函数:

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

据我所知,Python 的 GIL 使得 CPU 密集型任务无法使用线程。

例如,我的 gRPC 服务器提供 TensorFlow 模型和 gRPC 健康检查服务。增加线程池中的线程数对我有什么好处吗?

【问题讨论】:

    标签: python multithreading grpc


    【解决方案1】:

    现在 grpc python 绑定到并发期货线程池,我相信路线图显示将来我们将能够使用 asyncio。线程池执行器只允许我们指定最大并发连接数。你是对的,使用 python 我们有 GIL,因此线程被限制在同一个 CPU 内核中,因此我们没有线程的并行性。如果您的任务受 CPU 限制,则它们不会通过添加更多线程在 python 中受益。

    线程池中的更多线程是否有任何好处实际上取决于您的应用程序的详细信息。您可以在一个进程中运行 grpc 服务器,在另一个进程中运行 tensorflow(使用多处理模块),这使您可以访问更多内核,但您需要确定将信息从 tensorflow 进程传输到 grpc 服务器的协议。

    【讨论】:

    • 谢谢!一个问题,如果我设置max_workers=1,当另一个服务或程序(带有模型)正在运行时,健康检查服务会阻塞吗?如果我增加工人数量,它会阻塞吗?
    • 是的,它会阻塞。如果您有 max_workers 1 并且有东西连接,则该工作人员会被第一个连接消耗,从而阻止任何其他连接,直到第一个断开连接。如果将worker增加到2个,则最多可以有2个并发连接。