代码之家  ›  专栏  ›  技术社区  ›  Simeon Leyzerzon mthmulders

Django的作业调度

  •  0
  • Simeon Leyzerzon mthmulders  · 技术社区  · 7 年前

    我需要在我们的django应用程序中实现一个预定的任务。数据库 schedule 似乎是一个很好的候选人的工作,但当运行它作为一个Django项目的一部分,它似乎没有产生预期的效果。

    具体来说,作为一个独立的程序,这很好地工作:

    import schedule
    import time
    
    import logging
    log = logging.getLogger(__name__)
    
    def handleAnnotationsWithoutRequests(settings):
        '''
        From settings passed in, grab job-ids list
        For each job-id in that list, perform annotation group/set logic [for details, refer to handleAnnotationsWithRequests(requests, username) 
                                                                         sans requests, those are obtained from db based on job-id ]
        '''
        print('Received settings: {}'.format(str(settings)))
    
    def job():
        print("I'm working...")
    
    #schedule.every(3).seconds.do(job)
    #schedule.every(2).seconds.do(handleAnnotationsWithoutRequests, settings={'a': 'b'})
    invoc_time = "10:33"
    schedule.every().day.at(invoc_time).do(handleAnnotationsWithoutRequests, settings={'a': 'b'})
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    

    但在Django上下文中运行的这个(等效的)代码不会导致调用。

    def handleAnnotationsWithoutRequests(settings):
        '''
        From settings passed in, grab job-ids list
        For each job-id in that list, perform annotation group/set logic [for details, refer to handleAnnotationsWithRequests(requests, username) 
                                                                         sans requests, those are obtained from db based on job-id ]
        '''
        log.info('Received settings: {}'.format(str(settings)))
    
    def doSchedule(settings):
        '''
        with scheduler library
        Based on time specified in settings, invoke .handleAnnotationsWithoutRequests(settings)
        '''
        #settings will need to be reconstituted from the DB first
        #settings = {}
        invocationTime = settings['running_at']
        import re
        invocationTime = re.sub(r'([AaPp][Mm])', "", invocationTime)
        log.info("Invocation time to be used: {}".format(invocationTime))
        schedule.every().day.at(invocationTime).do(handleAnnotationsWithoutRequests, settings=settings)
    
        while True:
            schedule.run_pending()
            time.sleep(1)
    

    所以日志来自 handleAnnotationsWithoutRequests() 不显示在控制台上。

    this scheduling library 与Django兼容?有没有可以参考的使用示例?

    我怀疑这里有一些线程问题。也许还有更好的选择可以使用?欢迎提出建议。

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   AKX Bryan Oakley    7 年前

    对于Web服务器,您可能不需要在进程中运行的内容:

    An in-process scheduler for periodic jobs [...]

    https://github.com/Tivix/django-cron 已经证明了一个有效的解决方案。

    还有重量级冠军芹菜和芹菜节拍。