【GRPC】module ‘socket‘ has no attribute ‘SO_REUSEPORT‘

发布时间:2022-08-19 13:44

项目场景:

使用 GRPC 搭建 python 版 server 服务时,启动 server 会出现如下的报错:

module 'socket' has no attribute 'SO_REUSEPORT'

【注意】我使用的是grpc github中的python多进程示例代码:https://github.com/grpc/grpc/blob/master/examples/python/multiprocessing/server.py


问题描述

报错的代码是这一段:

@contextlib.contextmanager
def _reserve_port():
    """Find and reserve a port for all subprocesses to use."""
    sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0:
        raise RuntimeError("Failed to set SO_REUSEPORT.")
    sock.bind(('', 0))
    try:
        yield sock.getsockname()[1]
    finally:
        sock.close()

详细的错误日志如下:
【GRPC】module ‘socket‘ has no attribute ‘SO_REUSEPORT‘_第1张图片


解决方案:

【解决方案一】更新python的版本

网上查看过其他人说的可能是python版本的问题,他用的是3.8.1版本的。
然后我的python版本是:3.7.9 ,运行就会报错。
后来我更新python版本到:3.7.10 就可以用的了。

【解决方法二】

如果不方便更新python版本,也可以尝试一下以下的方案:
在调用socket之前设置:

    if not hasattr(socket, 'SO_REUSEPORT'):
        socket.SO_REUSEPORT = 15

具体例子如下:

@contextlib.contextmanager
def _reserve_port():
    """Find and reserve a port for all subprocesses to use."""
    if not hasattr(socket, 'SO_REUSEPORT'):
        socket.SO_REUSEPORT = 15
    sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 0:
        raise RuntimeError("Failed to set SO_REUSEPORT.")
    sock.bind(('', 0))
    try:
        yield sock.getsockname()[1]
    finally:
        sock.close()

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号