Flask 允许多个服务器实例监听同一端口

Kak*_*rot 6 python flask server

我一直在使用烧瓶并注意到这种不寻常的行为。

我的 Flask 应用程序设置为在我的机器的端口 5000 上运行(它只有一个网卡)。

当我尝试在我的机器中启动同一烧瓶应用程序的多个实例时。

我的期望

尝试启动绑定在同一端口上的下一个实例时出现端口地址使用错误。

实际发生了什么

它们都成功启动并绑定到同一端口。我使用过的大多数传统服务器都不会出现这种行为。但值得庆幸的是,当对服务器进行 REST API 调用时,“n”个进程中仅触发一个进程。

操作系统:Windows

有人可以解释一下为什么会发生这种行为,以及如何确保 Flask 在这种情况下不会成功启动该过程。

netstat -aon | 网络统计 找到“5000”

TCP 127.0.0.1:5000 0.0.0.0:0 监听 37036
TCP 127.0.0.1:5000 0.0.0.0:0 监听 5024
TCP 127.0.0.1:5000 0.0.0.0:0 监听 61684

以上是并行运行的3个进程。

补充笔记:

  1. 我在 virtualenv 中使用它。
  2. 我编写烧瓶调用的方式。

    if __name__ == "__main__":
    main()
    app.run(port=5000)
    
    Run Code Online (Sandbox Code Playgroud)
  3. python3 <filename>.py在命令提示符处运行代码。

小智 5

这可能是 Windows 特定的行为以及它们管理套接字的方式。在 Windows 上,您可以将多个进程绑定到同一端口进行侦听。人们发现这会导致很多安全问题,因此 Windows 发布了更新,可以防止端口通过 SO_EXCLUSIVEADDRUSE 套接字标志被另一个进程劫持。您可以在https://learn.microsoft.com/en-us/windows/desktop/winsock/so-exclusiveaddruse阅读更多相关信息

从我通过阅读 Flask 开发服务器代码可以看出,用户无法设置 SO_EXCLUSIVEADDRUSE 标志。