如何使grpc猴子修补的代码仅打开v4套接字默认情况下会打开v6套接字

问题描述

我是python的初学者,一直遇到问题。我希望根据我的代码需要在禁用ipv6的环境中运行的期望,尝试创建仅v4的grpc服务器套接字。

我的问题是,以下代码认情况下不会在地址0.0.0.0上创建v4套接字。

首先, 这是带有输出的测试文件。 Python版本2.7.5。

s = df['NUMBER_OF_WORDS'].ne(1).cumsum()
out = df.groupby(s).agg({'SECTION':'first','TEXT':','.join,'NUMBER_OF_WORDS':'sum'})

我在Centos 7上看到端口50053的“ netstat -antop”输出是:


from gevent import monkey
monkey.patch_all()

from concurrent import patches
import grpc.experimental.gevent
grpc.experimental.gevent.init_gevent()


def main():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    server.add_insecure_port('0.0.0.0:50053')
    server.start()
    var = 1
    while var == 1 :
        pass

if __name__ == "__main__":
    import sys
    del sys.argv[1:]
    sys.exit(main())

我想要这个:

tcp6       0      0 :::50053                :::*                    LISTEN      745/python           off (0.00/0/0)

替换

tcp        0      0 0.0.0.0:50053            0.0.0.0:*               LISTEN      1/python             off (0.00/0/0)

作者

import grpc.experimental.gevent
grpc.experimental.gevent.init_gevent()

使这项工作有效。
你能帮我理解吗?

谢谢。

解决方法

这让我有些惊讶,因为在实现中,我们显式检查套接字家族并创建相应的套接字类型:https://github.com/grpc/grpc/blob/master/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi#L77

快速search之后,这似乎是一个名为双栈的Linux功能。它可以帮助应用程序同时绑定到ipv4和ipv6。如果您不想要它,那么有很多关于如何禁用此功能的文档。