python - 使用 gevents Wsgi 服务器在一个进程中多次启动和停止 Flask 应用程序

标签 python flask server wsgi gevent

我有一个 flask 应用程序,我需要在同一进程中启动然后关闭它并重复多次。我在应用程序中使用 gevents,因此我使用 gevents.pywsgi 作为我的 WSGI 服务器。现在我正在尝试正常关闭服务器,以便在执行其他一些操作后可以在同一进程中重新启动它。

因此,以下代码创建一个基本的 Flask 应用程序,当接收到带有/hit 端点上的任何有效数据的 POST 请求时,该应用程序会填充数据字段。 greenlet 与该应用程序并行运行,当它看到数据字段已填充时,它会关闭服务器。

    def func():
    global data
    data = None

    app = Flask(__name__)

    @app.route('/hit', methods=['POST'])
    def hit():
        global data
        data = request.json

        if data is not None:
            return "Input Recieved, Server closed "
        else:
            return "Invalid Input, Try again"

    def shutdown_server(_server):
        global data
        while data is None:
            sleep(0.5)
        _server.stop()
        _server.close()

    server = WSGIServer(('0.0.0.0',5100), app)

    start = spawn(server.start)
    stop = spawn(shutdown_server, request, server)

    joinall([start, stop])

    return True

现在,如果我运行服务器一次,此代码运行正常,但如果我尝试在同一进程中再次运行服务器,则会抛出以下错误:

Traceback (most recent call last):
  File "src/gevent/greenlet.py", line 766, in gevent._greenlet.Greenlet.run
  File "/home/batman/Documents/genisys/lib/python3.6/site-packages/gevent/baseserver.py", line 308, in start
    self.start_accepting()
  File "/home/batman/Documents/genisys/lib/python3.6/site-packages/gevent/baseserver.py", line 160, in start_accepting
    self._watcher = self.loop.io(self.socket.fileno(), 1)
AttributeError: 'WSGIServer' object has no attribute 'socket'

我不确定这是否可能,或者如果我想多次运行服务器,是否必须在单独的进程中运行服务器。谁能告诉我为什么我会遇到这个错误,是否有更好、更干净的方法来关闭服务器,这样我就不会遇到这个错误?

编辑:我将 IP 和端口作为 func 的参数,因此我尝试多次使用不同的端口调用 func 并多次使用相同的端口,但仍然遇到相同的错误。

最佳答案

我认为问题是您已经在端口 5100 上运行服务器,因此您无法在同一端口上运行进程,因此当您想要启动进程时必须动态更改端口号

关于python - 使用 gevents Wsgi 服务器在一个进程中多次启动和停止 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60280830/

相关文章:

javascript - 向 Flask 提交多个表单(400 BAD REQUEST)

javascript - 将数据从 javascript/html 页面发送到 Express NodeJS 服务器

apache - 将所有流量重定向到 https ://www. example.com

python - 通过 python 脚本查找 unicode 范围

python - 如何处理 python/Flask 上的按钮单击

python - 一个 Numpy 错误,看似与抛出它的脚本无关,但不会显示在调试器上

python - 如何确定 HSL 颜色检测的上下边界?

php - GitHub 页面是否支持 PHP?

python - 为什么使用 TensorFlow 进行多元线性回归时会得到不同的权重?

javascript - 如何使用颜色渐变推导出颜色的相对百分比值