Предполагая, что вам нужно запустить несколько, возможно, одновременных, экземпляров фоновой задачи, решение представляет собой очередь задач.Я слышал хорошие новости о Celery и RabbitMQ, если вы ищете сторонние варианты, и web2py включает свою собственную систему задач систему, которая может быть достаточной для ваших нужд.
Используя любой инструмент, вы определите функцию, которая инкапсулирует операцию, которую вы хотите выполнить в фоновом процессе.Затем выведите рабочих очереди в оперативный режим.Руководство web2py и форумы указывают, что это можно сделать с помощью оператора @reboot в системе cron web2py, который запускается при каждом запуске веб-сервера.Возможно, есть другие способы запуска рабочих, если это неудовлетворительно.
В вашем контроллере вы будете вставлять задачу в очередь задач, передавая любые необходимые параметры в качестве входных данных для функции (фоновая функция не будет запускатьсяв той же среде, что и контроллер, поэтому он не будет иметь доступа к сеансу, БД и т. д., если вы явно не передадите соответствующие значения в функцию задачи).
Теперь, чтобы получить выходные данныефоновая операция для пользователя.Когда вы вставляете задачу в очередь, вы должны получить уникальный идентификатор для задачи.Затем вы реализуете логику контроллера (то, что ожидает AJAX-вызов, или страницу, которая обновляется до завершения задачи), которая вызывает API очереди задач, чтобы проверить состояние указанной задачи.Если состояние задачи «выполнено», верните данные пользователю.Если нет, продолжайте ждать.