10

我有一个重复的python计划任务如下,它需要在startMonitor()中每3分钟运行一次getMyStock():

from stocktrace.util import settings
import time, os, sys, sched
schedule = sched.scheduler(time.time, time.sleep)

def periodic(scheduler, interval, action, actionargs=()):
  scheduler.enter(interval, 1, periodic,
                  (scheduler, interval, action, actionargs))
  action(*actionargs)


def startMonitor():    
    from stocktrace.parse.sinaparser import getMyStock       

    periodic(schedule, settings.POLLING_INTERVAL, getMyStock)
    schedule.run( )

问题是:

1.当一些用户事件发生时,我如何取消或停止日程安排?

2.有没有其他python模块可以更好的重复调度?就像javaquartz一样?

4

2 回答 2

16

Q1:scheduler.enter返回被安排的事件对象,所以保持对它的处理,你可以cancel

from stocktrace.util import settings
from stocktrace.parse.sinaparser import getMyStock   
import time, os, sys, sched

class Monitor(object):
    def __init__(self):
        self.schedule = sched.scheduler(time.time, time.sleep)
        self.interval = settings.POLLING_INTERVAL
        self._running = False

    def periodic(self, action, actionargs=()):
        if self._running:
            self.event = self.scheduler.enter(self.interval, 1, self.periodic, (action, actionargs))
            action(*actionargs)

    def start(self):
        self._running = True
        self.periodic(getMyStock)
        self.schedule.run( )

    def stop(self):
        self._running = False
        if self.schedule and self.event:
            self.schedule.cancel(self.event)

我已将您的代码移动到一个类中,以便更方便地引用该事件。

Q2 不在本网站的范围内。

于 2012-10-16T04:50:17.340 回答
2

用于取消计划的操作

scheduler.cancel(event)

从队列中移除事件。如果 event 不是当前队列中的事件,此方法将在此处引发 ValueError Doc

eventscheduler.enter函数的返回值,可用于稍后取消事件

于 2012-10-16T04:45:51.660 回答