我有一个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'
我不确定这是否可能,或者如果要多次运行,是否必须在单独的进程中运行服务器。谁能告诉我为什么我会遇到此错误,并且有更好更好的方法关闭服务器,这样我就不会遇到此错误了吗?
我认为问题是您已经在端口5100上运行服务器,因此再次不能在同一端口上运行进程,因此当您要启动该进程时,必须动态更改端口号