web-dev-qa-db-ja.com

1時間ごとに正確に実行するためのPythonスクリプトのスケジューリング

私が尋ねる前に、Cron Jobs and Task Schedulerが私の最後のオプションになります。このスクリプトはWindowsとLinuxで使用されます。エンドユーザーが完了します。

タスクをスケジュールするために使用できるPythonのライブラリはありますか? 1時間に1回関数を実行する必要がありますが、1時間に1回スクリプトを実行して.sleepを使用すると、時間の経過とともに、「1時間に1回」が遅延のために前日とは異なる時間に実行されますスクリプトおよび/または関数の実行/実行に固有のもの。

best特定の時刻(複数回)に関数を実行するようにスケジュールする方法は何ですかwithoutを使用してcronジョブまたはタスクスケジューラでスケジュールしますか?

またはこれが不可能な場合は、あなたの入力もお願いします。

AP Schedulerは私のニーズに正確に適合します。

バージョン<3.0

import datetime
import time
from apscheduler.scheduler import Scheduler

# Start the scheduler
sched = Scheduler()
sched.daemonic = False
sched.start()

def job_function():
    print("Hello World")
    print(datetime.datetime.now())
    time.sleep(20)

# Schedules job_function to be run once each minute
sched.add_cron_job(job_function,  minute='0-59')

でる:

>Hello World
>2014-03-28 09:44:00.016.492
>Hello World
>2014-03-28 09:45:00.0.14110

バージョン> 3.0

(以下のAnimesh Pandeyの回答より)

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', seconds=10)
def timed_job():
    print('This job is run every 10 seconds.')

@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
    print('This job is run every weekday at 10am.')

sched.configure(options_from_ini_file)
sched.start()
45
sunshinekitty

多分これが役立つかもしれません: 高度なPythonスケジューラー

ドキュメントからの小さなコードは次のとおりです。

from apscheduler.schedulers.blocking import BlockingScheduler

def some_job():
    print "Decorated job"

scheduler = BlockingScheduler()
scheduler.add_job(some_job, 'interval', hours=1)
scheduler.start()
50
Unknown

毎時10分ごとに何かを実行する。

from datetime import datetime, timedelta

while 1:
    print 'Run something..'

    dt = datetime.now() + timedelta(hours=1)
    dt = dt.replace(minute=10)

    while datetime.now() < dt:
        time.sleep(1)
23
Shane Davies

apscheduler <3.0については、 不明な回答 を参照してください。

apscheduler> 3.0の場合

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', seconds=10)
def timed_job():
    print('This job is run every 10 seconds.')

@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
    print('This job is run every weekday at 10am.')

sched.configure(options_from_ini_file)
sched.start()

更新:

apschedulerドキュメント

apscheduler-3.3.1Python 3.6.2に対してこれ。

"""
Following configurations are set for the scheduler:

 - a MongoDBJobStore named “mongo”
 - an SQLAlchemyJobStore named “default” (using SQLite)
 - a ThreadPoolExecutor named “default”, with a worker count of 20
 - a ProcessPoolExecutor named “processpool”, with a worker count of 5
 - UTC as the scheduler’s timezone
 - coalescing turned off for new jobs by default
 - a default maximum instance limit of 3 for new jobs
"""

from pytz import utc
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ProcessPoolExecutor

"""
Method 1:
"""
jobstores = {
    'mongo': {'type': 'mongodb'},
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
    'default': {'type': 'threadpool', 'max_workers': 20},
    'processpool': ProcessPoolExecutor(max_workers=5)
}
job_defaults = {
    'coalesce': False,
    'max_instances': 3
}

"""
Method 2 (ini format):
"""
gconfig = {
    'apscheduler.jobstores.mongo': {
        'type': 'mongodb'
    },
    'apscheduler.jobstores.default': {
        'type': 'sqlalchemy',
        'url': 'sqlite:///jobs.sqlite'
    },
    'apscheduler.executors.default': {
        'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
        'max_workers': '20'
    },
    'apscheduler.executors.processpool': {
        'type': 'processpool',
        'max_workers': '5'
    },
    'apscheduler.job_defaults.coalesce': 'false',
    'apscheduler.job_defaults.max_instances': '3',
    'apscheduler.timezone': 'UTC',
}

sched_method1 = BlockingScheduler() # uses overrides from Method1
sched_method2 = BlockingScheduler() # uses same overrides from Method2 but in an ini format


@sched_method1.scheduled_job('interval', seconds=10)
def timed_job():
    print('This job is run every 10 seconds.')


@sched_method2.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
    print('This job is run every weekday at 10am.')


sched_method1.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
sched_method1.start()

sched_method2.configure(gconfig=gconfig)
sched_method2.start()
17
Animesh Pandey

Sunshinekittyが投稿した「Version <3.0」というバージョンでは、apscheduler 2.1.2を指定する必要があります。 2.7インストールで誤ってバージョン3を使用していたため、次のようにしました。

pip uninstall apscheduler
pip install apscheduler==2.1.2

その後、正常に機能しました。お役に立てば幸いです。

1
Arkham Angel

Python標準ライブラリは、このタスクに対して sched および threading を提供します。しかし、これは、OSに実行を任せる代わりに、スケジューラスクリプトが常に実行されていることを意味します。

0
aepsil0n

1つのオプションは、pythonスクリプトを定期的に実行するC/C++ラッパーを作成することです。エンドユーザーはC/C++実行可能ファイルを実行します。これはバックグラウンドで実行されたままで、定期的にpythonスクリプトを実行します。これは最善の解決策ではないかもしれません。C/ C++を知らない場合、またはこの100%pythonを保持したい場合は機能しない可能性があります。しかし、人々は実行可能ファイルをクリックすることに慣れているため、これは最もユーザーフレンドリーなアプローチのように見えます。これらはすべて、pythonがエンドユーザーのコンピューターにインストールされていることを前提としています。

もう1つのオプションは、cronジョブ/タスクスケジューラを使用することですが、エンドユーザーが実行する必要がないように、インストーラーにスクリプトとして配置することです。

0
ubadub
   #For scheduling task execution
import schedule
import time

def job():
    print("I'm working...")

schedule.every(1).minutes.do(job)
#schedule.every().hour.do(job)
#schedule.every().day.at("10:30").do(job)
#schedule.every(5).to(10).minutes.do(job)
#schedule.every().monday.do(job)
#schedule.every().wednesday.at("13:15").do(job)
#schedule.every().minute.at(":17").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)
0