问题标签 [grpc-python]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
216 浏览

python - 如何使用 python grpc 有效地将数据从服务器发送回客户端

我想知道是否有推荐的方法将数据从服务器返回到 GRPC python 中的客户端。

目前,我有一个专用服务器的 RPC 调用,它在每个客户端调用上都会阻塞 - 它在数据队列上循环(当为空时阻塞)以获取数据并将其发送回客户端。此调用的服务器实现:

它看起来超级尴尬,不可扩展,并且明显减慢了通信速度。在 NodeJS、C#、c++ 实现中,实现这一点要容易得多。但是使用 Python 实现似乎不可能有效地完成这一点。我真的希望我错过了什么。

此外,服务器当前从客户端接收数据,将其添加到队列中,然后将其返回给客户端(无需任何处理)。同样,使用上面的代码,即使没有任何处理,我的性能也会急剧下降!

谢谢,迈克

0 投票
1 回答
3047 浏览

python - gRPC python客户端认证示例

您如何使用 gRPC python auth 库进行客户端和服务器身份验证?该文档仅涵盖服务器身份验证。

是否grpc.secure_channel()需要使用其他标志?

0 投票
2 回答
2316 浏览

python - 如何从 setuptools 安装程序 (setup.py) 中生成 python grpc 代码?

我们在 repo 中有一些 gRPC 的 proto 文件,我读到提交生成的代码并不好。所以我想我需要将生成作为包安装的一部分(例如 setuptools、setup.py)

但是,要生成 gRPC 代码,您需要先pip install grpcio-tools按照文档运行安装包。但是 setup.py 的目的是自动拉下像grpcio-tools这样的依赖项。

那么是否有这样做的最佳实践?如,如何从 setuptools 中生成依赖于另一个 python 包的代码?我最好创建一个单独的build.sh脚本来手动安装并生成代码吗?还是我应该期望该软件包的用户已经安装了grpcio-tools

0 投票
1 回答
1469 浏览

python - Python gRPC 服务器不监听指定端口

我正在尝试按照此示例制作一个 gRPC python 服务器-客户端应用程序,但我无法将服务器放在我的代码上处于侦听状态。添加几乎与示例完全相同的代码并运行该start方法后,指定的端口上没有任何内容正在监听。我的代码是:

的代码当然是基于我interface_pb2_grpc.ManipulaMapaServicer的自动生成的(使用命令) :python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. interface.protointerface.proto

执行到达while True:内部循环,main但端口上没有运行服务器8888。这里有什么问题?顺便说一句,这个问题与这个问题没有重复,因为在最后一个问题中,问题是由在start方法之后运行的垃圾收集器引起的。

0 投票
2 回答
1388 浏览

python - 运行 grpc python 示例必须使用 sudo 命令

依赖本教程grpc basic

我克隆https://github.com/grpc/grpc到本地,

cd example/python/helloworld 启动服务器python greeter_server.py

然后启动客户端python greeter_client.py,但得到错误

然后我执行sudo python greeter_client.py,得到正确的结果。

为什么我应该添加 sudo 以获得正确的结果?

0 投票
0 回答
70 浏览

python - 如何通过线程响应客户端 - PYTHON

我正在尝试(失败)将 gRPC(grpc.io)与线程一起使用。

我希望在收到请求后将其扩展到一个线程并通过该线程进行响应,而不需要 gRPC 的“返回”部分。

这是我的方法:

出队过程将发生在线程内。之后,我想将一些值返回给请求者。

有没有办法在使用异步关键字的情况下做到这一点?

0 投票
2 回答
905 浏览

python-multithreading - gRPC + 线程本地问题

我用 python 构建了一个 grpc 服务器,并尝试使用 werkzeug Local 和 LocalProxy 处理一些线程本地存储,类似于 flask 所做的。

我面临的问题是,当我从服务器拦截器将一些数据存储在本地,然后尝试从服务端检索它时,本地是空的。真正的问题是,由于某种原因,拦截器在与服务程序不同的 greenlet 中运行,因此从 werkzeug.local 开始,不可能跨请求共享数据。对于应该属于同一请求的数据,存储最终会使用不同的密钥。

使用 python 线程库也会发生同样的情况,看起来拦截器是从主线程或与服务程序不同的线程运行的。有解决方法吗?我本来希望拦截器在同一个线程中运行,从而允许这种事情。

0 投票
1 回答
315 浏览

grpc - 如何发送错误详细信息,例如 BadRequest

我需要发送有关 gRPC 错误的丰富结构化错误详细信息。

我想可能是这样的:

但这是错误的,并在摘要错误文本中发送字节。

我使用 grpcio==1.17.1

0 投票
1 回答
6219 浏览

python - 将 gRPC 错误代码映射到 HTTP 错误代码

我的 Web 应用程序向可扩展服务代理(ESP)发出 HTTP 请求,而后者又委托给gRPC 服务器(用 Python 编写)。忽略 Android 和 iOS 客户端,架构是:

在此处输入图像描述

ESP 是一个nginx 反向代理

gRPC 服务器(参考架构中的“您的代码”)可能会引发异常,在这种情况下,我使用context.abort引发异常并以非 OK 状态终止 RPC:

虽然可以使用set_codeset_details,但它们仍然会导致 HTTP 状态为 200 OK。

有两个问题:

  1. gRPC状态码由 ESP 容器(nginx 代理)转换为通用500 Internal Server Error的 .

  2. 随附的详细信息已被删除。

  3. 和 2. 组合意味着 Web 客户端最多对 gRPC 服务器引发的所有异常具有500 Internal Server Errora

最终,我不明白如何将更多信息(理想情况下,自定义)错误返回给网络客户端。

0 投票
0 回答
305 浏览

android - grpc 调用见 grpc 调用的主体/流

我正在使用 Anki Vector SDK 和 Python 来访问 Anki Vector 机器人。但是,SDK 仅限于 Python,我想为 Vector 编写 Android 应用程序。所以我试图弄清楚 API 端点及其参数以及如何使用它们。不幸的是,Anki 在他们的 SDK 上使用了 GRPC 来访问 API 端点。他们还提供了一些用于其他语言的 proto 文件。但是,我无法理解如何使用它们。

相反,我尝试使用以下环境变量进行 GRPC 跟踪:

我可以使用此方法获取 HTTP 调用的标头。(下面的示例跟踪日志)但我看不到 HTTP 调用的主体(或流内容)

我怎么才能得到它?

值=67 72 70 63 2d 70 79 74 68 6f 6e 2f 31 2e 31 37 2e 31 20 67 72 70 63 2d 63 2f 37 2e 30 2e 30 20 28 6c 69 6e 75 78 3b 20 70 3 2 6 34274 67 69 7a 6d 6f 29 'grpc-python/1.17.1 grpc-c/7.0.0 (linux; chttp2; gizmo)', key=67 72 70 63 2d 61 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 'grpc-accept-encoding' value=69 64 65 6e 74 69 74 79 2c 64 65 66 6c 61 74 65 2c 67 7a 69 70 'identity,deflate,gzip', key=61 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 '接受编码' value=69 64 65 6e 74 69 74 79 2c 67 7a 69 70 'identity,gzip'} SEND_MESSAGE:flags=0x00000000:len=2 SEND_TRAILING_METADATA{} RECV_INITIAL_TRAILING_METACV RECV_INITIAL_TRAILING_METACV on_complete = 0x6c90b1b4 I0105 16:40:33.659194720 2405 chttp2_transport.cc:1376] HTTP:0:HDR:CLI::scheme: https I0105 16:40:33。