1

Denken Sie, es ist möglich, asyncio zu verwenden, um eine Aufgabe alle n Sekunden in Django auszuführen, so dass der Hauptprozess nicht blockiert wäre?Verwendung von asyncio periodische Aufgabe in Django

Etwas zum Beispiel, dass alle 5 min in der Konsole gedruckt würde, wie:

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)) 

Es scheint, dass django aufhören zu arbeiten, während die Schleife läuft. Auch wenn dies in der Entwicklung funktionieren kann, wie würde es sich verhalten, wenn die Site auf etwas wie Apache oder Gunicorn läuft?

+0

Vielleicht wäre Multiprocessing eine Alternative? – Mikael

Antwort

4

Während es möglich wäre, dies mit viel harter Arbeit zu erreichen. Viel einfacher ist es, die altehrwürdige Praxis der Verwendung eines Cron-Jobs zu verwenden. Siehe auch: Using django for CLI tool

Heutzutage ist ein beliebterer Ansatz (unter den Django-Entwicklern auf jeden Fall), Sellerie zu verwenden. Speziell celery beat

Sellerie Beat ist ein Scheduler; Es startet Aufgaben in regelmäßigen Abständen, , die dann von verfügbaren Arbeiterknoten im Cluster ausgeführt werden.

Verwandte Themen