использование asyncio для выполнения периодической задачи в django

Как вы думаете, можно ли использовать asyncio для запуска задачи каждые n секунд в django, чтобы основной процесс не блокировался?

Что-то, например, что будет печатать каждые 5 минут в консоли, например:

    import asyncio
    from random import randint

    async def do_stuff(something, howmany):   
        for i in range(howmany):
            print('We are doing  {}'.format(something))
            await asyncio.sleep(randint(0, 5))

    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        work = [
            asyncio.ensure_future(do_stuff('something', 5)),

        ]
        loop.run_until_complete(asyncio.gather(*work))

Кажется, что django перестанет работать во время выполнения цикла. Даже если это можно заставить работать в разработке, как он поведет себя, когда сайт заработает на чем-то вроде apache или gunicorn?


person David Pekker    schedule 08.05.2017    source источник
comment
Может быть, альтернативой будет использование многопроцессорности?   -  person Mikael    schedule 08.05.2017


Ответы (1)


В то время как этого можно было бы достичь с большим упорным трудом. Гораздо проще использовать проверенную временем практику использования задания cron. См. это: Использование django для инструмента CLI

В настоящее время более популярным подходом (по крайней мере, среди разработчиков django) является использование сельдерея. В частности, сельдерей лучше

celery beat — планировщик; Он запускает задачи через равные промежутки времени, которые затем выполняются доступными рабочими узлами в кластере.

person e4c5    schedule 08.05.2017