gRPC Python quickstart/helloworld(greeter_client.py)在打印前挂起;接待客户收到:…”;

gRPC Python quickstart/helloworld(greeter_client.py)在打印前挂起;接待客户收到:…”;,python,go,grpc,Python,Go,Grpc,今天我想开始为我用Python编写的程序实现gRPC客户机和服务器。我遵循了这里的教程: 我所说的follow是指我能准确地按照指示,准确地输入每个命令。首先安装所有需求(在conda环境中),然后运行greeter_server.py和greeter_client.py。从技术上讲,该程序可以工作,但客户端程序在我的系统上挂起约30-40秒,然后用简单的问候语“Greeter client received:Hello,you!”进行响应 因此,我决定尝试以下快速入门教程的Go版本:。同样,按

今天我想开始为我用Python编写的程序实现gRPC客户机和服务器。我遵循了这里的教程:

我所说的follow是指我能准确地按照指示,准确地输入每个命令。首先安装所有需求(在conda环境中),然后运行greeter_server.py和greeter_client.py。从技术上讲,该程序可以工作,但客户端程序在我的系统上挂起约30-40秒,然后用简单的问候语“Greeter client received:Hello,you!”进行响应

因此,我决定尝试以下快速入门教程的Go版本:。同样,按照编写的所有说明,构建并启动go服务器和go客户端,客户端程序在不到一秒钟的时间内响应“2020/08/27 12:48:24问候语:Hello world”

go版本的运行方式与我预期的完全一致。然而,Python版本需要几乎一分钟的时间来响应一条简单的消息。有人知道发生了什么事吗

提前谢谢

编辑1)-我将用我刚刚做的一些测试来补充原始问题。我为原稿中缺少内容而道歉。所以,我一直在不同的机器上测试。在我的桌面上,这是一台Ubuntu20机器,问题就出现了。我可以简单地打开一个终端,创建一个新的conda环境(我在这些测试中使用了Python3.8)。我将执行快速入门教程。Python版本没有按预期工作(要让我相信所有的符号都正常工作需要很长时间)。我在围棋中快速启动,一切都很顺利

我在2011年的mac book air上测试了本教程,启动了一个终端,创建了一个新的conda环境(3.8),与Go版本相比,gRPC Quick Start的Python版本工作得很好(因为没有人注意到的差异)

因此,我想知道是否有任何gRPC专家会对为什么会发生这种情况提出建议。我已经重新启动了我的机器并再次进行了测试,但问题仍然存在于我的Ubuntu linux机器上

编辑2)-我刚刚在Ubuntu20云虚拟机上运行了一个类似的测试,一切正常(Python和Go版本之间没有区别)。我尝试了一个我在网上找到的seprate随机“echo”gRPC Python教程(与gRPC快速入门教程无关),这个问题在我的本地计算机上仍然存在。所以我相信这个问题可以和我的环境隔离开来。我迷路了

编辑3)-我通过调试器运行客户端代码并添加断点

from\uuuuu future\uuuuu导入打印功能
导入日志记录
进口grpc
导入helloworld_pb2
导入helloworld\u pb2\u grpc
def run():
#注意(gRPC Python团队):.close()在通道上是可能的,应该是
#用于with语句不符合需要的情况
#这是守则的一部分。
使用grpc.unsecure_频道('localhost:50051')作为频道:#添加了中断
存根=helloworld_pb2_grpc.问候存根(频道)#添加了中断
response=stub.SayHello(helloworld_pb2.HelloRequest(name='you'))#添加了中断挂起辅助'response'对象
打印(“接待员客户端收到:+response.message)#添加中断
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
logging.basicConfig()文件
运行()
它挂起在打印语句之前,在with块中。在我的mac上,我设置了相同的断点,调试器立即将响应对象分配给内存并打印。在我的Ubuntu机器上,调试器挂起,试图分配
response=stub.SayHello(helloworld\u pb2.HelloRequest(name='you'))
变量。我注意到Cython的用法,这可能是一个线索

如果我中断了greeter_client.py进程,我会得到以下跟踪:

  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
文件“greeter\u client.py”,第37行,在
运行()
文件“greeter_client.py”,第31行,正在运行
response=stub.SayHello(helloworld\u pb2.HelloRequest(name='you'))
文件“/home/james/.local/lib/python3.8/site packages/grpc/_channel.py”,第824行,在调用中__
状态、调用、=self.\u阻塞(请求、超时、元数据、凭据、,
文件“/home/james/.local/lib/python3.8/site packages/grpc/_channel.py”,第813行,在
event=call.next_event()
文件“src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi”,第338行,在grpc._cython.cygrpc.separagedcall.next_事件中
文件“src/python/grpcio/grpc/\u cython/\u cygrpc/channel.pyx.pxi”,第169行,在grpc.\u cython.cygrpc.\u下一个\u调用\u事件中
文件“src/python/grpcio/grpc/\u cython/\u cygrpc/channel.pyx.pxi”,第163行,在grpc.\u cython.cygrpc.\u下一个\u调用\u事件中
文件“src/python/grpcio/grpc/\u cython/\u cygrpc/completion\u queue.pyx.pxi”,第63行,在grpc.\u cython.cygrpc.\u潜在事件中
文件“src/python/grpcio/grpc/_cython/_cygrpc/completion_queue.pyx.pxi”,第42行,在grpc._cython.cygrpc.\u下一步
键盘中断
编辑4)-其中一位评论者提出了一个很好的建议,即测试python客户机和go服务器的组合(gRPC允许零努力,go gRPC)。我执行了测试,Python客户端的响应仍然很慢。go客户端与go服务器的组合仍然很快。我相信这会缩小到Python客户端的问题。谢谢你@DazWilkin。为了完整性,Go客户端Python服务器在<1秒的时间内按预期工作


编辑5)-昨晚我完全重新安装了Ubuntu 20.04的最低版本。在新系统上,简单的greeter_client.py响应仍有大约45秒的延迟:(

这可能是所有包装器语言(Python、Ruby、PHP、C#、Node)的常见问题)。直接原因是C-Ares名称解析程序无法解析
localhost
的IPv6地址。可以通过指定环境变量
GRPC\u DNS\u 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