您的位置:

tornado出现ValueError("the platform doesn't support SO_REUSEPORT")的解决方案

  发布时间:2023-02-18 20:42:01
报错的原因错误在 Python 中出现是因为 Tornado 框架在尝试使用 SO_REUSEPORT 套接字选项时,该选项在运行程序所在的平台上不可用。SO_REUSEPORT 是一种套接字选项,允许多个进程或线程绑定到同一端口。可以通过在 Tornado 的 Application 实例中将其 reuse_port 设置为 False 来实现。另外, 注意在 Tornado 以后的版本中, reuse_port 这个参数已经不支持, 所以升级Tornado版本可能是一个解决方案。运行这个程序后,可以通过在浏览器中访问来测试服务器是否正常工作。

报错的原因

ValueError("the platform doesn't support SO_REUSEPORT") 错误在 Python 中出现是因为 Tornado 框架在尝试使用 SO_REUSEPORT 套接字选项时,该选项在运行程序所在的平台上不可用。 SO_REUSEPORT 是一种套接字选项,允许多个进程或线程绑定到同一端口。但是,这种选项在所有平台上都不可用,所以如果程序运行在不支持 SO_REUSEPORT 的平台上,就会出现这个错误。

如何解决

解决这个错误的方法主要有两种:

1. 在运行程序的平台上安装并激活 SO_REUSEPORT 选项。这可以通过修改内核参数来实现,但这可能因平台而异。

2. 修改代码,避免使用 SO_REUSEPORT 选项。可以通过在 Tornado 的 Application 实例中将其 reuse_port 设置为 False 来实现。

例如:


app = tornado.web.Application(
    handlers,
    reuse_port=False,
)

这样就可以避免使用不可用的 SO_REUSEPORT 选项。

另外, 注意在 Tornado 6.0 以后的版本中, reuse_port 这个参数已经不支持, 所以升级Tornado版本可能是一个解决方案。

使用例子

是的,下面是一个使用 Tornado 创建 HTTP 服务器的示例:


import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ],reuse_port=False)

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

在这个例子中,我们使用 `reuse_port=False` 作为 Application 实例的参数,这样就可以避免在运行这个程序的平台上使用不可用的 SO_REUSEPORT 选项。

运行这个程序后,可以通过在浏览器中访问 `http://localhost:8888` 来测试服务器是否正常工作。