Flask允许多个服务器实例在同一端口上侦听

时间:2017-12-13 05:56:47

标签: python flask server

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

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

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

我的期望

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

实际发生的事情

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

操作系统:Windows

有人可以解释为什么会出现这种情况,以及如何确保烧瓶在这种情况下不会成功启动该过程。

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 LISTENING 61684

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

附加说明:

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

    if __name__ == "__main__":
    main()
    app.run(port=5000)
    
  3. 在命令提示符下以python3 <filename>.py运行代码。

1 个答案:

答案 0 :(得分:0)

这可能是Windows特定的行为以及它们如何管理套接字。在Windows上,您可以将多个进程绑定到同一端口以进行侦听。发现这会引起很多安全问题,因此Windows发布了更新程序,这些更新程序可以防止端口通过SO_EXCLUSIVEADDRUSE套接字标志被其他进程劫持。您可以在https://docs.microsoft.com/en-us/windows/desktop/winsock/so-exclusiveaddruse

上了解更多信息

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