Не могу разобраться в документации https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-date-callback
Что должно быть:
Страница сайта периодически читает данные из БД, а пользователь по нажатию кнопки должен запустить долгую процедуру заполнения БД и видеть процесс заполнения в реальном времени.
Что есть:
JS функция show отправляет каждые 500мс ajax запрос на адрес /api/show и отрисовывает список строк из БД.
На сервере (Flask) ей отвечает функция
@app.route('/api/show') def show(): records = ... return json.dumps(records, cls=AlchemyEncoder)
Вторая JS функция по кнопке “Запустить долгую задачу” отправляет ajax запрос на адрес /api/start_db_fill
На сервере ей отвечает функция
@app.route('/api/start_db_fill') def start_db_fill(): p = Process(target=worker) p.start() p.join() return json.dumps('') def worker(): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop = asyncio.get_event_loop() loop.run_until_complete(db_fill()) @asyncio.coroutine def db_fill(): ...
Что не работает:
Функция заполнения БД db_fill() запускается в синхронном режиме и сервер на отвечает на запросы отрисовки, пока процесс не отработает.