今天,我想开始为我用Python语言编写的程序实现一个gRPC客户机和服务器。我遵循了这里提供的教程:https://grpc.io/docs/languages/python/quickstart/。
我的意思是,我已经准确地遵循了指令,准确地按照书写的方式输入每个命令。首先(在conda环境中)安装所有需求,然后运行greeter_server.py和greeter_client.py。从技术上讲,该程序可以工作,但客户端程序在我的系统上挂起了大约30-40秒,然后以简单的问候"Greeter client received: Hello,you!“作为响应。
所以我决定尝试Go版的快速入门教程,可以在这里找到:https://grpc.io/docs/languages/go/quickstart/。再次严格按照所有指令编写并构建和启动go服务器和go客户端,客户端程序在不到一秒的时间内以"2020/08/27 12:48:24 Greeting: Hello world“响应。
go版本的表现完全符合我的预期。然而,Python版本几乎需要一分钟来响应一条简单的消息。有人知道这是怎么回事吗?
提前谢谢。
编辑1) -我将用我刚刚做的一些测试来补充原始问题。我为我在原文中的遗漏道歉。所以,我已经在不同的机器上进行了测试。在我的Ubuntu 20机器的桌面上,这个问题就出现了。我可以简单地打开一个终端,创建一个新的conda环境(我已经使用Python3.8进行了这些测试)。我执行快速入门教程。Python版本没有像预期的那样工作(它花了太长的时间来说服我一切都正常工作)。我在Go中执行快速入门,一切都运行得很好。
我在我2011年的mac图书air上测试了这个教程,启动终端,创建一个新的conda环境(3.8),与Go版本相比,gRPC快速入门的Python版本工作得很好(因为没有明显的人类差异)。
因此,我想知道是否有任何gRPC专家会有关于为什么会发生这种情况的建议。我重新启动了我的机器,并再次测试,但问题仍然存在于我的Ubuntu linux机器上。
编辑2) -我刚刚在Ubuntu 20云虚拟机上运行了一个类似的测试,一切都像预期的那样工作( 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()它就挂在print语句之前,在with块中。在我的mac上,我设置了相同的断点,调试器立即将响应对象分配给内存并打印出来。在我的Ubuntu机器上,调试器在尝试分配response = stub.SayHello(helloworld_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编辑4) -其中一个评论者有一个很好的建议,可以测试python客户端和go服务器的组合(gRPC可以毫不费力地做到这一点,go gRPC)。我执行了测试,Python客户端的响应速度仍然很慢。go客户端- go服务器组合仍然很快。我相信这就把范围缩小到了Python客户端的问题。谢谢你@DazWilkin。为了完整性,Go客户端- Python服务器在不到1秒的时间内就能正常工作。
编辑5) --昨晚我完全重装了Ubuntu 20.04的最小版本。在新的系统上,简单greeter_client.py的响应仍然有大约45秒的延迟。:(
发布于 2020-09-17 01:39:47
这可能是所有包装器语言(Python,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中。对于仍然被这个问题阻止的任何人,请随时在该帖子上发表评论,以便获得更多关注。
https://stackoverflow.com/questions/63621097
复制相似问题