使用gevents Wsgi服务器在进程中多次启动和停止flask应用程序

问题描述 投票:1回答:1

我有一个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'

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

python flask server wsgi gevent
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.