Запуск и остановка приложения flask несколько раз в процессе с использованием сервера gevents Wsgi - PullRequest
1 голос
/ 18 февраля 2020

У меня есть приложение 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 с другим портом несколько раз и с тем же портом несколько раз, я все еще получаю ту же ошибку.

1 Ответ

0 голосов
/ 18 февраля 2020

Я думаю, проблема в том, что вы уже запускаете сервер на порту 5100, поэтому вы снова не можете запустить процесс на том же порту, поэтому вам нужно динамически менять номера портов, когда вы хотите запустить процесс

...