我试图理解如何使用双向流(使用pythonapi)处理grpcapi。在
假设我有以下简单的服务器定义:
syntax = "proto3";
package simple;
service TestService {
rpc Translate(stream Msg) returns (stream Msg){}
}
message Msg
{
string msg = 1;
}
假设将从客户端发送的消息是异步的(因为用户选择了一些ui元素)。在
为客户机生成的python存根将包含一个方法Translate
,该方法将接受生成器函数并返回迭代器。在
我不清楚的是,如何编写生成器函数,在用户创建消息时返回这些消息。在等待消息时睡在线程上听起来不是最好的解决方案。在
现在这有点笨拙,但是您可以按照以下方式完成您的用例:
基本思想是让一个名为
TranslatorClient
的对象在一个单独的线程上运行,将请求和响应关联起来。它期望响应将按照发出请求的顺序返回。它还实现了迭代器接口,以便您可以直接将其传递给存根上的Translate
方法的调用。在我们启动一个运行
_run_client
的线程,该线程从TranslatorClient
中提取响应,并在另一端用add_response
反馈它们。在我在这里包含的
main
函数实际上只是一个临时工,因为我没有您的UI代码的详细信息。我在一个ThreadPoolExecutor
中运行_translate
,以证明即使translator_client.translate
是同步的,它也会产生结果,允许您一次有多个正在处理的请求。在我们认识到,要为这样一个简单的用例编写大量代码。最终,答案将是
asyncio
支持。在不久的将来,我们有这个计划。但目前,无论您运行的是python2还是python3,这种解决方案都应该让您继续工作。在相关问题 更多 >
编程相关推荐