0

ツイストアプリケーションでcronのような動作を実装したいと思います。定期的な呼び出し(たとえば毎週)をトリガーしたいのですが、アプリケーションを起動したときではなく、正確な時間にのみ実行しています。

私のユースケースは次のとおりです。私のPythonアプリケーションは週のいつでも開始されます。毎週月曜日の午前8時に電話をかけたいです。しかし、(time.sleep()を使用して)アクティブな待機を実行したくないので、callLaterを使用して次の月曜日に呼び出しをトリガーし、その日付からループ呼び出しを開始したいと思います。

何かアイデア/アドバイスはありますか?ありがとう、J。

4

2 に答える 2

7

cronスタイルの指定子が大好きな場合は、parse-crontabの使用を検討することもできます。

その場合、コードは基本的に次のようになります。

from crontab import CronTab
monday_morning = CronTab("0 8 * * 1")

def do_something():
    reactor.callLater(monday_morning.next(), do_something)
    # do whatever you want!

reactor.callLater(monday_morning.next(), do_something)
reactor.run()
于 2013-01-31T18:18:21.863 に答える
1

私があなたの質問を正しく理解した場合、あなたはスケジュールされたタスクの最初の実行とアプリの最初の開始時間を提供する方法を考えています。この場合、callLaterに渡されるtimedelta値を秒単位で計算する必要があります。

import datetime
from twisted.internet import reactor

def cron_entry():
    full_weekseconds = 7*24*60*60
    print "I was called at a specified time, now you can add looping task with a full weekseconds frequency"


def get_seconds_till_next_event(isoweekday,hour,minute,second):
    now = datetime.datetime.now()
    full_weekseconds = 7*24*60*60
    schedule_weekseconds = ((((isoweekday*24)+hour)*60+minute)*60+second)
    now_weekseconds=((((now.isoweekday()*24)+now.hour)*60+now.minute)*60+now.second)

    if schedule_weekseconds > now_weekseconds:
        return schedule_weekseconds - now_weekseconds
    else:
        return  now_weekseconds - schedule_weekseconds + full_weekseconds


initial_execution_timedelta = get_seconds_till_next_event(3,2,25,1)
"""
This gets a delta in seconds between now and next Wednesday -3, 02 hours, 25 minutes and 01 second
"""
reactor.callLater(initial_execution_timedelta,cron_entry)
reactor.run()
于 2013-01-29T10:48:51.413 に答える