- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天,我想开始为用Python编写的程序实现gRPC客户端和服务器。我已按照此处找到的教程进行操作:https://grpc.io/docs/languages/python/quickstart/。
遵循我的意思是我完全遵循了指示,键入的每个命令都与编写的完全相同。首先安装所有要求(在conda环境中),然后运行greeter_server.py和greeter_client.py。从技术上讲,该程序可以运行,但是该客户端程序在我的系统上挂起大约30-40秒,然后以简单的问候“收到Greereter客户端:您好!”进行响应。
因此,我决定尝试在此处找到的快速入门教程的Go版本:https://grpc.io/docs/languages/go/quickstart/。再次严格按照所有指令进行操作,并构建并启动go服务器和go客户端,客户端程序在不到一秒钟的时间内响应“2020/08/27 12:48:24问候:Hello world”。
go版本的行为完全符合我的预期。然而,Python版本花费了将近一分钟的时间来回答一条简单的消息。有人知道发生了什么吗?
提前致谢。
编辑1)-我将通过一些测试来补充原始问题。对于原著中的不足,我深表歉意。因此,我一直在不同的机器上进行测试。在我的台式机(Ubuntu 20计算机)上,存在此问题。我可以简单地弹出一个终端,创建一个新的conda环境(我已经使用Python 3.8进行了这些测试)。我执行快速入门教程。 Python版本无法正常工作(要使我确信一切正常工作都花了太长时间)。我在Go中执行快速入门,一切运行正常。
我在2011年的Macbook Air上测试了该教程,启动了一个终端,创建了一个新的conda环境(3.8),并且与Go版本相比,gRPC Quick Start的Python版本运行良好(因为没有人为的区别)。
所以我想知道是否有任何gRPC专家会建议为什么发生这种情况。我已经重新启动计算机并再次进行了测试,但是问题仍然存在于我的Ubuntu Linux计算机上。
编辑2)-我只是在Ubuntu 20云VM上进行了类似的测试,并且一切都按预期工作(Python和Go版本之间没有区别)。我尝试了在网上找到的单独的随机“回声” gRPC Python教程(与gRPC快速入门教程无关),该问题在本地仍然存在。因此,我认为这个问题可以与我的环境隔离。我搞不清楚了。
编辑3)-我通过调试器运行了客户端代码并添加了断点。
from __future__ import print_function
import logging
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
# NOTE(gRPC Python Team): .close() is possible on a channel and should be
# used in circumstances in which the with statement does not fit the needs
# of the code.
with grpc.insecure_channel('localhost:50051') as channel: # added break
stub = helloworld_pb2_grpc.GreeterStub(channel) # added break
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you')) # added break - HANGS ASSINING `response` OBJECT
print("Greeter client received: " + response.message) # added break
if __name__ == '__main__':
logging.basicConfig()
run()
它卡在with块内的print语句之前。在Mac上,我设置了相同的断点,调试器立即将响应对象分配给内存并进行打印。在我的Ubuntu计算机上,调试器挂起,尝试分配
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
变量。我注意到使用Cython可能是一个线索。
File "greeter_client.py", line 37, in <module>
run()
File "greeter_client.py", line 31, in run
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
File "/home/james/.local/lib/python3.8/site-packages/grpc/_channel.py", line 824, in __call__
state, call, = self._blocking(request, timeout, metadata, credentials,
File "/home/james/.local/lib/python3.8/site-packages/grpc/_channel.py", line 813, in _blocking
event = call.next_event()
File "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi", line 338, in grpc._cython.cygrpc.SegregatedCall.next_event
File "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi", line 169, in grpc._cython.cygrpc._next_call_event
File "src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi", line 163, in grpc._cython.cygrpc._next_call_event
File "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi", line 63, in grpc._cython.cygrpc._latent_event
File "src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi", line 42, in grpc._cython.cygrpc._next
KeyboardInterrupt
编辑4)-其中一位评论者提出了一个很好的建议,可以测试python客户端和服务器组合(gRPC允许您以零的努力进行操作,即gRPC)。我执行了测试,但Python客户端的响应速度还是一样慢。 Go客户端-Go服务器组合仍然很快。我相信这会将其范围缩小到Python客户端上的问题。谢谢@DazWilkin。为了完整起见,Go客户端-Python服务器在不到1秒的时间内即可正常工作。
最佳答案
对于所有包装语言(Python,Ruby,PHP,C#,Node),这可能是一个常见问题。直接原因是C-Ares名称解析器无法解析localhost
的IPv6地址。可以通过指定环境变量GRPC_DNS_RESOLVER=native
来避免该问题,该变量会更改默认名称解析器。
这是James提供的日志中的“挂起”部分:
D0831 13:09:27.577593604 6445 dns_resolver_ares.cc:184] (c-ares resolver) resolver:0x55eaa9dbd8a0 AresDnsResolver::StartLocked() is called.
D0831 13:09:27.577596674 6445 grpc_ares_wrapper.cc:645] (c-ares resolver) request:0x55eaa9d99b80 c-ares grpc_dns_lookup_ares_locked_impl name=localhost:50051, default_port=https
D0831 13:09:27.577653493 6445 grpc_ares_ev_driver.cc:158] (c-ares resolver) request:0x55eaa9d99b80 grpc_ares_ev_driver_create_locked
D0831 13:09:27.577679913 6445 grpc_ares_wrapper.cc:200] (c-ares resolver) request:0x55eaa9d99b80 create_hostbyname_request_locked host:localhost port:33731 is_balancer:0 qtype:AAAA
D0831 13:09:27.577725082 6445 grpc_ares_wrapper.cc:200] (c-ares resolver) request:0x55eaa9d99b80 create_hostbyname_request_locked host:localhost port:33731 is_balancer:0 qtype:A
D0831 13:09:27.577736032 6445 grpc_ares_wrapper.cc:227] (c-ares resolver) request:0x55eaa9d99b80 on_hostbyname_done_locked qtype=A host=localhost ARES_SUCCESS
D0831 13:09:27.577740632 6445 grpc_ares_wrapper.cc:273] (c-ares resolver) request:0x55eaa9d99b80 c-ares resolver gets a AF_INET result:
addr: 127.0.0.1
port: 50051
D0831 13:09:27.577745522 6445 grpc_ares_ev_driver.cc:392] (c-ares resolver) request:0x55eaa9d99b80 new fd: c-ares fd: 10
D0831 13:09:27.577748092 6445 grpc_ares_ev_driver.cc:98] (c-ares resolver) request:0x55eaa9d99b80 Ref ev_driver 0x55eaa9cfd900
D0831 13:09:27.577750552 6445 grpc_ares_ev_driver.cc:406] (c-ares resolver) request:0x55eaa9d99b80 notify read on: c-ares fd: 10
D0831 13:09:27.577753342 6445 grpc_ares_ev_driver.cc:463] (c-ares resolver) request:0x55eaa9d99b80 ev_driver=0x55eaa9cfd900 grpc_ares_ev_driver_start_locked. timeout in 120000 ms
D0831 13:09:27.577755682 6445 grpc_ares_ev_driver.cc:98] (c-ares resolver) request:0x55eaa9d99b80 Ref ev_driver 0x55eaa9cfd900
D0831 13:09:27.577763612 6445 grpc_ares_ev_driver.cc:227] (c-ares resolver) request:0x55eaa9d99b80 ev_driver=0x55eaa9cfd900. next ares process poll time in 1000 ms
D0831 13:09:27.577765852 6445 grpc_ares_ev_driver.cc:98] (c-ares resolver) request:0x55eaa9d99b80 Ref ev_driver 0x55eaa9cfd900
D0831 13:09:27.577773282 6445 dns_resolver_ares.cc:448] (c-ares resolver) resolver:0x55eaa9dbd8a0 Started resolving. pending_request_:0x55eaa9d99b80
此错误的跟踪问题位于
grpc#24018中。对于仍然被此问题阻止的任何人,请随时在该线程上发表评论,以便它可以引起更多关注。
关于python - 在打印 “Greeter client received: …”之前,gRPC Python quickstart/helloworld(greeter_client.py)已挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63621097/
这个问题已经有答案了: What does "Could not find or load main class" mean? (63 个回答) 已关闭 7 年前。 我用java语言编写了一个简单的程
在使用 Expo 的 React Native 项目中,我尝试使用 export 部署以下云函数: 注意:我在 index.js 中使用 Javascript。 export const helloW
解决了“无法找到或加载主类Hello”错误的问题后...运行程序后我再次遇到这个问题(我使用文本板)代码是: class HelloWorld { public static void m
我最初尝试像这样推送我的(有史以来第一次!)git repo: $ git push helloworld 但我得到了这个: To git-smichaels@free5.projectlocker.
全新安装,通过 vue cli 安装 Vue。运行 vue create app并使用基本配置进行设置。 从 Home.vue 中删除 HelloWorld.vue 组件和附带的导入代码。 运行 np
我第一次编程有点问题。我收到消息 可以获取“c:\users\amittler\source\repos\HelloWorld...”吗? 谢谢你的帮助 最佳答案 是的,得到这个就可以了。 您的 ID
好的,我只是无法让 java 运行我的 .class 文件:我按照 Oracle tutorial 中的步骤操作并尝试运行这个程序: class HelloWorldApp { public
我是 Scala 和 SBT 的新手,所以我可能会遗漏一些明显的东西。 我试图在 http://www.scalafx.org/docs/quickstart/ 上编译 HelloWorld 示例 我
这是我的设置: docker pull riot/riotbuild wget https://github.com/RIOT-OS/RIOT/archive/2019.04.zip unzip 20
我一直在尝试创建我的第一个 Jenkins 插件。一切都很好,只是全局配置在 jenkins 服务重新启动后不会保留。 只要服务不重新启动,配置就可以很好地保存。 全局配置果冻文件... Jenki
我尝试从终端运行基本的 HelloWorld.class 文件。 我使用以下输入: Java HelloWorld.class 但它说: Error: Could not find or load "
以下代码取自 http://doc.akka.io/docs/akka/2.2.3/AkkaScala.pdf import akka.actor.Actor object Greeter { c
我带着这样一个微不足道的问题来到 Stack Exchange 感到内疚,但我整个上午都在为它苦苦思索,似乎无处可去。我正在尝试运行 Grails 教程中的简单 HelloWorld 应用程序:htt
好吧,这真的让我很生气。我在我的模拟器和安卓设备上都运行了它。该代码不显示“Helloworld, Android -mykong.com”。我启动应用程序,在模拟器上找到它,单击它,它会转到应用程序
我回到了 c++(我已经好几年没用过它了)来学习 box2d API。 我确切地说我在 Linux 系统 (Ubuntu) 上并且我已经从 this guide 之后的源代码安装了 box2d(2.3
社区成员推荐我分析以下内容,以了解 ARM 架构中发出的系统调用。我怀疑如何在这种结构中获取程序。我已经尝试过 gdb disas 命令,但部分不可见。请帮助。 .data HelloWorldStr
在编译我的 wxWidget HelloWorld 应用程序时,出现以下错误: Warning 1 warning LNK4098: defaultlib 'LIBCMTD' conflicts
我刚刚为我的 eclipse 安装了 c/c++ 开发工具,一切正常,除了当我运行 hello world 程序时控制台中没有打印任何文本,但我没有收到任何错误。我真的很困惑,有人知道这是为什么吗?
我在以下文件夹 C:\Program Files\Java 中安装了 Java 1.7.0。我的操作系统是带有 Service Pack 3 的 Windows XP(2002 版)。 我设置的环境变
前言 讲解Spring之前,我们首先梳理下Spring有哪些知识点可以进行入手源码分析,比如: Spring IOC依赖注入 Spring AOP切面编程 Spri
我是一名优秀的程序员,十分优秀!