在TF服务示例中,如何理解gRPC从客户端发出的请求并发?

时间:2020-02-13 04:32:32

标签: multithreading tensorflow grpc tensorflow-serving condition-variable

背景

根据Serving a TensorFlow Model

mnist client中的程序是关于

与加载了mnist模型的tensorflow_model_server对话的客户端。

客户端下载mnist数据集的测试图像,并使用

查询服务

通过这样的测试图像进​​行预测,并计算推理错误率。

问题

我很难理解gRPC从客户端发出的并发请求。

  1. Define concurrency

  2. Concurrency related code

  for _ in range(num_tests): # <==

    request = predict_pb2.PredictRequest()
    request.model_spec.name = 'mnist'
    request.model_spec.signature_name = 'predict_images'
    image, label = test_data_set.next_batch(1)
    request.inputs['images'].CopyFrom(
        tf.make_tensor_proto(image[0], shape=[1, image[0].size]))

    result_counter.throttle() # <==

    result_future = stub.Predict.future(request, 5.0)  # 5 seconds
    result_future.add_done_callback(
        _create_rpc_callback(label[0], result_counter))

根据我的理解,以上代码在for循环中按顺序执行。 我已阅读有关条件变量的文章,并锁定Python。由于我什至没有看到定义多个线程来发送请求,因此即使我将标志设置为10,也不会与并发相关。(Define concurrency

如果我有误解,我可能会忽略gRPC。

如果代码不是真正的并发,如何使其正确?

1 个答案:

答案 0 :(得分:0)

gRPC Python使用后台线程从较低级别轮询消息。为了同时运行RPC,您可以在线程中创建多个RPC期货。当任何RPC完成时(后台线程收集的结果),您的回调将被调用。

https://github.com/grpc/grpc/blob/0b4a9d6ba0a60a1982d81da6bb6b730a5c443c44/src/python/grpcio/grpc/_channel.py#L1126

希望这会有所帮助,随时询问更多细节。

相关问题