为什么我的Tornado/Flask服务器在使用请求进行锤击时会在Windows上窒息死亡?

Way*_*ner 5 python sockets tornado flask

我在Windows上有一个简单的测试应用程序 - 运行Flask wsgi应用程序的Tornado.我可以很好地启动服务器并通过我的网络浏览器连接,这很酷.

我可以运行我的性能测试,在我的机器上我每秒可以获得约900-1000个请求.但是,在大约20,000个请求之后,我的服务器停止响应并且我的测试报告每秒0.我可以尝试通过Web浏览器进行连接,但没有.通常情况下,ctrl+ c也存在一些问题(在浏览器中刷新页面之前必须多次点击才能正常结束服务器).

那么为什么我的服务器在这样敲击它时会窒息而死?

好吧,所以在试图排除不同因素的过程中 - 我能够从不同的机器上击中服务器,即使我的本地机器正在bar,所以看起来它实际上是我的本地机器用完了端口或什么的?

无论如何,这是我的代码:

server.py

from flask import Flask

app = Flask(__name__)


@app.route("/")
def main():
    return "Hey, it's working"


if __name__ == "__main__":
    app.run("0.0.0.0", port=5000, debug=True)
Run Code Online (Sandbox Code Playgroud)

tornado_server.py

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from server import app

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

perftest.py

from socket import *
import time

n = 0
stop = False

from threading import Thread
def monitor():
    global n, stop
    while not stop:
        time.sleep(1)
        print(n, 'reqs/sec')
        n = 0


if __name__ == "__main__":
    t = Thread(target=monitor).start()
    while True:
        try:
            sock = socket(AF_INET, SOCK_STREAM)
            sock.connect(('localhost', 5000))
            sock.send(b'''GET / HTTP/1.1\n\n''')
            resp = sock.recv(4096)
            sock.close()
            n += 1
        except KeyboardInterrupt:
            stop = True
        except:
            pass
Run Code Online (Sandbox Code Playgroud)

Kla*_* D. 1

我猜你的端口已经用完了。您建立的每个连接都会阻塞一个端口,并且需要一些时间来关闭它们,在 Windows 上比其他操作系统上的时间要长。作为一个症状,一段时间后应该会有所收获,但只是很快。

您可以使用 进行检查netstat