首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gRPC Python quickstart/helloworld (greeter_client.py)在打印“欢迎客户已收到...”之前挂起

gRPC Python quickstart/helloworld (greeter_client.py)在打印“欢迎客户已收到...”之前挂起
EN

Stack Overflow用户
提问于 2020-08-28 01:14:45
回答 1查看 444关注 0票数 2

今天,我想开始为我用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) -我通过调试器运行客户端代码,并添加了断点。

代码语言:javascript
复制
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进程,我会得到以下跟踪:

代码语言:javascript
复制
  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秒的延迟。:(

EN

回答 1

Stack Overflow用户

发布于 2020-09-17 01:39:47

这可能是所有包装器语言(Python,C#,Node)的常见问题。直接原因是C-Ares域名解析程序无法解析localhost的IPv6地址。可以通过指定更改默认名称解析器的环境变量GRPC_DNS_RESOLVER=native来绕过此问题。

以下是James提供的日志中的挂起部分:

代码语言:javascript
复制
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中。对于仍然被这个问题阻止的任何人,请随时在该帖子上发表评论,以便获得更多关注。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63621097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档