mirror of https://github.com/tiangolo/fastapi.git
85 lines
7.6 KiB
Markdown
85 lines
7.6 KiB
Markdown
# Фонові задачі { #background-tasks }
|
||
|
||
Ви можете створювати фонові задачі, які будуть виконуватися після повернення відповіді.
|
||
|
||
Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді.
|
||
|
||
Це включає, наприклад:
|
||
|
||
* Надсилання email-сповіщень після виконання певної дії:
|
||
* Підключення до поштового сервера та надсилання листа може займати кілька секунд. Ви можете відразу повернути відповідь, а email-сповіщення надіслати у фоні.
|
||
* Обробка даних:
|
||
* Наприклад, якщо ви отримали файл, який потрібно обробити довготривалим процесом, можна повернути відповідь «Accepted» (HTTP 202) і виконати обробку файлу у фоні.
|
||
|
||
## Використання `BackgroundTasks` { #using-backgroundtasks }
|
||
|
||
Спочатку імпортуйте `BackgroundTasks` і оголосіть параметр у вашій функції операції шляху з анотацією типу `BackgroundTasks`:
|
||
|
||
{* ../../docs_src/background_tasks/tutorial001_py310.py hl[1,13] *}
|
||
|
||
**FastAPI** створить для вас об’єкт типу `BackgroundTasks` і передасть його як цей параметр.
|
||
|
||
## Створення функції задачі { #create-a-task-function }
|
||
|
||
Створіть функцію, яка буде виконуватися як фонова задача.
|
||
|
||
Це звичайна функція, яка може отримувати параметри.
|
||
|
||
Вона може бути асинхронною `async def` або звичайною `def` функцією – **FastAPI** обробить її правильно.
|
||
|
||
У нашому випадку функція записує у файл (імітуючи надсилання email).
|
||
|
||
І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`:
|
||
|
||
{* ../../docs_src/background_tasks/tutorial001_py310.py hl[6:9] *}
|
||
|
||
## Додавання фонової задачі { #add-the-background-task }
|
||
|
||
Усередині вашої функції операції шляху, передайте функцію задачі в об'єкт background tasks, використовуючи метод `.add_task()`:
|
||
|
||
{* ../../docs_src/background_tasks/tutorial001_py310.py hl[14] *}
|
||
|
||
`.add_task()` приймає аргументи:
|
||
|
||
* Функцію задачі, яка буде виконуватися у фоновому режимі (`write_notification`).
|
||
* Будь-яку послідовність аргументів, які потрібно передати у функцію задачі у відповідному порядку (`email`).
|
||
* Будь-які іменовані аргументи, які потрібно передати у функцію задачі (`message="some notification"`).
|
||
|
||
## Впровадження залежностей { #dependency-injection }
|
||
|
||
Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у функції операції шляху, у залежності (залежний), у підзалежності тощо.
|
||
|
||
**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту:
|
||
|
||
{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *}
|
||
|
||
У цьому прикладі повідомлення будуть записані у файл `log.txt` після того, як відповідь буде надіслана.
|
||
|
||
Якщо у запиті був переданий параметр запиту, він буде записаний у лог у фоновій задачі.
|
||
|
||
А потім інша фонова задача, згенерована у функції операції шляху, запише повідомлення з використанням параметра шляху `email`.
|
||
|
||
## Технічні деталі { #technical-details }
|
||
|
||
Клас `BackgroundTasks` походить безпосередньо з [`starlette.background`](https://www.starlette.dev/background/).
|
||
|
||
Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`.
|
||
|
||
Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у функції операції шляху, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`.
|
||
|
||
Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його.
|
||
|
||
Детальніше можна почитати в [офіційній документації Starlette про Background Tasks](https://www.starlette.dev/background/).
|
||
|
||
## Застереження { #caveat }
|
||
|
||
Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як [Celery](https://docs.celeryq.dev).
|
||
|
||
Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і особливо — на кількох серверах.
|
||
|
||
Якщо ж вам потрібно отримати доступ до змінних і об’єктів із тієї ж **FastAPI**-програми або виконувати невеликі фонові завдання (наприклад, надсилати email-сповіщення), достатньо просто використовувати `BackgroundTasks`.
|
||
|
||
## Підсумок { #recap }
|
||
|
||
Імпортуйте та використовуйте `BackgroundTasks` як параметри у функціях операції шляху та залежностях, щоб додавати фонові задачі.
|