2017-05-08 100 views
1

您認爲可以使用asyncio在django中每n秒運行一次任務,以便主進程不會被阻塞?使用asyncio在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之類的網站上運行時它的行爲如何?

+0

也許使用多處理將是一種替代? – Mikael

回答

4

儘管可以通過很多努力來實現這一目標。更簡單的是使用使用cron作業的優秀實踐。看到這個:Using django for CLI tool

時下更流行的方法(在任何速率的django開發者之間)是使用芹菜。具體celery beat

芹菜拍是一個調度程序;它定期啓動任務, 然後由集羣中的可用工作節點執行。