Flask перезагрузчик и многопроцессорность - PullRequest
0 голосов
/ 16 июня 2020

У меня возникает следующая проблема с перезагрузкой приложения Flask на Windows, когда задействована многопроцессорность.

Я создал небольшой пример, чтобы продемонстрировать проблему, с которой я столкнулся.

from flask import Flask
from werkzeug import run_simple, _reloader
import multiprocessing as mp
import os
import time


def worker_function(app_id):
    while True:
        time.sleep(2)
        # print(f'Message from {app_id}: {message}')


class MyFlask(Flask):
    def __init__(self, name):
        super().__init__(name)
        print(f'Initialising Flask app {id(self)}')

        with open('./test.txt', 'r') as f:
            self.message = f.readlines()[0]

        self.worker_process = None
        self.is_runing_from_reloader = os.environ.get("WERKZEUG_RUN_MAIN") == "true"

    def make_workers(self):
        self.worker_process = mp.Process(target=worker_function, args=(id(self),))
        self.worker_process.start()


app = MyFlask(__name__)


@app.route('/')
def message():
    return f'Running from reloader: {app.is_runing_from_reloader}. {app.message}'


if __name__ == "__main__":
    mp.freeze_support()
    print('Running main...')
    app.make_workers()
    run_simple(hostname='0.0.0.0', port=5000, application=app, use_reloader=True, extra_files=['./test.txt'])

Проблема в том, что когда я вношу изменения в test.txt, Flask обнаруживает, что есть изменения, но перезагрузка приложения зависает. Все работает отлично, пока worker_process не запускается.

Итак, я знаю, что это как-то связано с рабочим процессом, но я не могу понять, что именно.

...