我有一个重复的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模块可以更好地重复调度?就像java quartz?
答案 0 :(得分:8)
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超出了本网站的范围。
答案 1 :(得分:1)
取消预定的操作
scheduler.cancel(event)
从队列中删除事件。如果event不是队列中当前的事件,则此方法将引发ValueError Doc here
event
是scheduler.enter
函数的返回值,可用于以后取消事件