【问题标题】:grpc timeout in a celery task芹菜任务中的grpc超时
【发布时间】:2018-04-21 15:25:25
【问题描述】:

我正在尝试在 celery 任务中连接到 GRPC 服务器。我有以下代码

    timeout = 1
    host = '0.tcp.ngrok.io'
    port = '7145'
    channel = grpc.insecure_channel('{0}:{1}'.format(host, port))
    try:
        grpc.channel_ready_future(channel).result(timeout=timeout)
    except grpc.FutureTimeoutError:
        sys.exit(1)
    stub = stub(channel)

当我通过 Python shell 运行这个 sn-p 时,我能够建立连接,并执行 GRPC 方法。但是,当我通过 Celery 任务运行它时,我得到了grpc.FutureTimeoutError,并且连接没有建立。

Celery worker 与 grpc 服务器位于同一台机器上。我尝试使用 socket 库来 ping GRPC 服务器,并且成功(它返回了一些垃圾响应)。

我使用的是 Python 2.7,安装了 grpcio==1.6.0。 Celery 版本是 4.1.0。任何指针都会有所帮助。

【问题讨论】:

  • 你是在同一台机器上运行 shell 和 celery 吗?你确定这里没有涉及防火墙吗?
  • 它们在同一台机器上运行。应该没有连接问题,因为在 Celery 任务中,我尝试连接 socket 库。它能够访问 grpc 服务器(尽管它没有连接)

标签: python celery grpc


【解决方案1】:

我相信 Celery 在底层使用了 fork,而 gRPC 1.6 不支持任何分叉行为。

尝试更新到 gRPC 1.7。

【讨论】:

  • 两位高级工程师花了 3 个小时才追查到这一点。要是我们早点搜索就好了。
最近更新 更多