веб-приложение на Python, запуск асинхронной функции без отдельного сервера - PullRequest
0 голосов
/ 11 января 2019

Как мне запускать асинхронные функции во время просмотра django / flask?

В node.js я могу легко обойти асинхронную функцию, например так:

module.exports.myView = function (request, response) {
    myVerySlowFunction(function (nonsense) {
        console.log('handle triggered nonsense', nonsense);
    });
    response.json({ message: 'ok' });
}

Это очень типично делать в узле, но я никогда не видел, чтобы это было сделано в django. Я хочу перевести это так:

def my_view(request):
    apply_async(my_very_slow_function)
    return Response({'message': 'okay'})

Я использовал Celery в прошлом для этого, но мне кажется излишним иметь отдельный запущенный сервер, чтобы я мог запускать асинхронные функции.

Я знаю, что могу запускать асинхронные функции следующим образом: https://stackoverflow.com/a/1239252/4637643,, но никогда не видел их в контексте веб-приложения.

Это плохая идея? я должен искать другое решение?

1 Ответ

0 голосов
/ 11 января 2019
  1. Пожалуйста, проверьте каналы django. Эта библиотека написана полностью асинхронно и готова к отправке в Django в будущем, это совершенно другая реализация и не совместимая с текущей средой wsgi. Асинхронный потребитель обрабатывает входящие сообщения в цикле событий, реализованном с использованием asyncio, и вы должны запустить приложение на asgi-сервере. Более подробную информацию вы можете найти в документации.

2.Если вы хотите сами реализовать функциональность aync в синхронном мире, по моему скромному мнению, возможно, вы также можете запустить новый поток или процесс, выполняющий цикл while, непрерывно проверяющий задачи и регистрирующий фоновые задачи, как сельдерей. подробнее читайте в 11.12. Понимание событийно-управляемых операций ввода-вывода из поваренной книги python

...