发布时间: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()
网上查看过其他人说的可能是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()
37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项
Ultra Fast Structure-aware Deep Lane Detection论文解读
.net+FusionChart实现动态显示的柱状图和饼状图
Spring Cloud Alibaba——Nacos进行多配置文件的加载
redis实现轮询算法_Redis批量操作是什么?怎么实现延时队列及订阅模式+LRU
thinkphp 分页 paginate 怎么使用 each循环数据 进行操作