首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Django

django-apscheduler 任务计划问题咨询

  •  
  •   fanne · 169 天前 · 1210 次点击
    这是一个创建于 169 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用了这个框架的 django-apscheduler

    代码内容

    # -*- coding: utf-8 -*-
    import datetime
    import time
    from apscheduler.schedulers.background import BackgroundScheduler
    from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
    from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
    
    executors = {
            'default': ThreadPoolExecutor(10),
            'processpool': ProcessPoolExecutor(3)
        }
    scheduler = BackgroundScheduler(executors=executors)
    scheduler.add_jobstore(DjangoJobStore(), 'default')
    
    
    def cron_test():
        print '当前时间:{0}'.format(datetime.datetime.now())
    
    def cron_task(run_time):
        task_idss = str(time.time())
        print task_idss
        scheduler.add_job(func=cron_test, next_run_time=run_time, id=task_idss)
        scheduler.start()
        
    

    在 django 的一个 view 里面调用

    class GameOpenTimeView(View):
        def post(self, request, obj_id):
            print obj_id
            open_time = request.POST.get("open_time")
            print open_time
            open_time = datetime.datetime.strptime(open_time,"%Y-%m-%d %H:%M:00")
            print type(open_time)
            print open_time
            cron_task(open_time)
            return JsonResponse({'status': 'success'})
            
    

    时间由前端页面传入

    image

    问题

    当我第一次传一个时间进入,可以正常生成一个任务点

    当我第二次传入一个时间,出现告警说

        return self.dispatch(request, *args, **kwargs)
      File "/Users/apple/OneDrive/Code_7zGame/Envs/tdops/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
        return handler(request, *args, **kwargs)
      File "/Users/apple/OneDrive/vultr_svn/Django_myself/tdops/pro1/views.py", line 340, in post
        cron_task(open_time)
      File "/Users/apple/OneDrive/vultr_svn/Django_myself/tdops/opsbase/schedwork.py", line 23, in cron_task
        scheduler.start()
      File "/Users/apple/OneDrive/Code_7zGame/Envs/tdops/lib/python2.7/site-packages/apscheduler/schedulers/background.py", line 33, in start
        BaseScheduler.start(self, *args, **kwargs)
      File "/Users/apple/OneDrive/Code_7zGame/Envs/tdops/lib/python2.7/site-packages/apscheduler/schedulers/base.py", line 134, in start
        raise SchedulerAlreadyRunningError
    SchedulerAlreadyRunningError: Scheduler is already running
    [04/Sep/2018 20:53:21] "POST /pro1/gameopentime/1003/ HTTP/1.1" 500 18550
    
    

    这个是为何,这个模块之前也是有用过,也没出现这样当情况,不过之前是直接使用了 apscheduler 模块 然后后面也有换成了 apscheduler 模块试过,也是一样情况的

    正常不是一个任务就一个 scheduler.start() 的么,为何不给再起一个的。

    9 回复  |  直到 2018-09-05 11:21:22 +08:00
        1
    Allianzcortex   169 天前
    我也想知道......理论上每次传的任务的 id 不同,job_kwargs 也不同,就是不同的任务....... scheduler 里有个 @property running,可以看这个 scheduler 是否正在运行,LZ 要不调试试试
        2
    fanne   169 天前
    @Allianzcortex #1 @property running 要怎么看,看控制台好像也没有这些信息的
        3
    maxmilia   169 天前
    UI 是啥啊? bootstrap 模板吗?感觉挺好的
        4
    fanne   169 天前
    @maxmilia #3 inspinia
        6
    fanne   168 天前
    @Allianzcortex #5 print scheduler.get_jobs() 第一次打印出
    [<Job (id=1536109767.33 name=cron_test)>]

    第二次却有 3 个
    [<Job (id=1536109843.6 name=cron_test)>, <Job (id=1536065600.84 name=cron_test)>, <Job (id=1536065592.63 name=cron_test)>]
        7
    fanne   168 天前
    @Allianzcortex #5 可以了,我逻辑错了,把所有的初始化放在了 cron_task 函数外部
        8
    Allianzcortex   168 天前 via iPhone
    @fanne ? cron_task 里 task_idss = str(time.time()),也就是每一个任务的 id 是以发起任务的时间作为标志,所以感觉应该不会重复啊,什么叫做把初始化放在函数外部......
        9
    fanne   168 天前
    @Allianzcortex #8 scheduler = BackgroundScheduler(executors=executors)

    这个内容
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1036 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 18:25 · PVG 02:25 · LAX 10:25 · JFK 13:25
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1