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

6

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

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

当我尝试在我的机器上启动多个相同flask应用程序实例时。

我的期望:

当尝试在相同的端口上绑定下一个实例时,会出现端口地址已在使用错误。

实际发生的情况:

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

操作系统:Windows

有人能解释一下这种行为为什么会发生,以及如何确保flask在这种情况下不会成功启动该进程吗?

netstat -aon | find "5000"

TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 37036
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 5024
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 61684

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

附加说明:

  1. I am using this in a virtualenv.
  2. The way I have written my flask invocation.

    if __name__ == "__main__":
    main()
    app.run(port=5000)
    
  3. Running the code as python3 <filename>.py at the command prompt.


如果 name == "main": main() app.run(port=5000) - Kakarot
@GarbageCollector 我已经在问题中添加了信息。 - Kakarot
1
使用开发示例?我已在Windows、Mac和Linux上测试了Flask开发服务器,如果我尝试在不关闭已运行的服务器的情况下启动Flask服务器多次,它确实会抛出“端口已经被使用”的错误。 - Sohaib Farooqi
在Linux上观察到OSError,使用Flask 0.12.1,py 3.5.2,稍有不同的设置(debug为False),加1。 - Vasif
@AsadSaeeduddin 不是的。我只是用 Flask 运行它。 - Kakarot
显示剩余4条评论
1个回答

5
这可能是Windows特定的行为以及它们管理套接字的方式。在Windows上,您可以有多个进程绑定到同一端口进行监听。发现这会引起许多安全问题,因此Windows发布了更新,可以通过SO_EXCLUSIVEADDRUSE套接字标志防止另一个进程劫持端口。您可以在https://learn.microsoft.com/en-us/windows/desktop/winsock/so-exclusiveaddruse上了解更多信息。
从我阅读flask开发服务器代码中所看到的,似乎没有办法让用户设置SO_EXCLUSIVEADDRUSE标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接