10

startMonitor() で 3 分ごとに getMyStock() を実行する必要がある、次のような繰り返しの python スケジュール タスクがあります。

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クォーツのように?

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)

キューからイベントを削除します。イベントが現在キューにあるイベントでない場合、このメソッドはここでValueErrorドキュメントを発生させます

eventscheduler.enterは、後でイベントをキャンセルするために使用できる関数の戻り値です。

于 2012-10-16T04:45:51.660 に答える