【问题标题】:How to do Asynchronous streaming with gRPC?如何使用 gRPC 进行异步流式传输?
【发布时间】:2019-07-03 11:24:35
【问题描述】:

我正在尝试使用 dart(flutter) 客户端和带有 gRPC api 的 python 服务器进行实时图像分析。如何在 gRPC 中使用 dart-client 设置异步图像流?(如 websockets)

【问题讨论】:

    标签: python dart flutter grpc grpc-python


    【解决方案1】:

    您的问题范围太大。您必须决定要流式传输的内容,您是否尝试流式传输一个图像帧?请记住,如果您希望每条消息发送超过 1MB,gRPC 提倡重新设计您的系统或使用其他东西。

    我不熟悉 dart,但假设您需要将图像流式传输到运行 dart 的客户端,您可以让客户端向 python 服务器发送请求,然后让 python 服务器将帧流回。原型可能如下所示:

    service FrameService {
    
      rpc FrameStreamer(FrameRequest) returns (stream Frame) {}
    
    }
    
    message FrameRequest {
        //empty
    }
    
    message Frame {
        //put your data in here, perhaps bytes?
        //or an frame id, etc.
    }
    

    【讨论】:

      【解决方案2】:

      这是一个相当大的话题,但你要求一个 dart 客户端,所以我假设你有一个看起来像 this 的“.proto”文件和一个工作 python-server。

      如果你想将你的 dart-client 连接到一个异步流,你必须这样做。

        typedef FrameStreameCallback = Function(Frame);
      
        ResponseStream<Frame> _frameStream;
        void getFrames(FrameStreameCallback cb) {
          FrameRequest req = new FrameRequest();
          //Set data of req and so on...
      
          _frameStream =  _stub.FrameStreamer(req);
      
          _frameStream.listen((Frame newFrame) {
            //Send callback when a new Frame is received
            cb(newFrame);
          });
          _messageStream.handleError((onError) {
            print("An error occured in frame stream " + onError);
          });
        }
      

      然后你这样调用这个方法:

      obj.getFrames((Frame f){
        print("New Frame received" + f.toString());
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2019-07-18
        • 2020-07-12
        • 2018-10-21
        • 2020-10-10
        • 2019-08-07
        • 1970-01-01
        相关资源
        最近更新 更多