У меня есть приложение flask, которое мне нужно запустить, а затем закрыть в том же процессе и повторить это несколько раз. Я использую gevents в своем приложении, поэтому я использую gevents.pywsgi
в качестве сервера WSGI. Теперь я пытаюсь корректно завершить работу сервера, чтобы я мог перезапустить его в том же процессе после нескольких других действий.
Итак, следующий код создает базовое c flask приложение, которое при получает запрос POST с любыми действительными данными на / попадание конечной точки заполняет поле данных. Гринлет работает параллельно с этим приложением, и когда он видит, что поле данных заполнено, он выключает сервер.
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 и порт в качестве аргументов для удовольствия c, поэтому я попытался вызвать fun c с другим портом несколько раз и с тем же портом несколько раз, я все еще получаю ту же ошибку.