使用 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()
详细的错误日志如下:
解决方案: 【解决方案一】更新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()



