it-swarm.com.de

Scheduling Python Skript, das stündlich korrekt ausgeführt wird

Bevor ich frage, Cron Jobs und Task Scheduler wird meine letzte Option sein, dieses Skript wird unter Windows und Linux verwendet und ich würde es vorziehen, eine verschlüsselte Methode dafür zu haben, als dies dem zu überlassen Endbenutzer zu vervollständigen.

Gibt es eine Bibliothek für Python, mit der ich Aufgaben planen kann? Ich muss eine Funktion im Laufe der Zeit einmal pro Stunde ausführen, wenn ich ein Skript einmal pro Stunde ausführe und .sleep verwende , "einmal pro Stunde" wird aufgrund der Verzögerung bei der Ausführung des Skripts und/oder der Funktion zu einem anderen Teil der Stunde als am Vortag ausgeführt.

Was ist die beste Methode, um eine Funktion so zu planen, dass sie zu einer bestimmten Tageszeit (mehr als einmal) ausgeführt wird , ohne ein Cron Job oder mit dem Task Scheduler einplanen?

Oder falls dies nicht möglich ist, hätte ich gerne auch Ihre Eingabe.

AP Scheduler passte genau zu meinen Bedürfnissen.

Version <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')

aus:

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

Version> 3.0

(Aus Animesh Pandeys Antwort unten)

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

Vielleicht kann dies helfen: Advanced Python Scheduler

Hier ist ein kleiner Code aus ihrer Dokumentation:

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

Etwas alle 10 Minuten nach der vollen Stunde laufen zu lassen.

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

Für apscheduler <3.0 siehe nbekannte Antwort .

Für 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()

Aktualisieren:

apschedulerDokumentation .

Dies für apscheduler-3.3.1 auf Python 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

In der von sunshinekitty veröffentlichten Version mit dem Namen "Version <3.0" müssen Sie möglicherweise apscheduler 2.1.2 angeben. Ich hatte versehentlich Version 3 auf meiner 2.7-Installation, also ging ich:

pip uninstall apscheduler
pip install apscheduler==2.1.2

Danach hat es richtig funktioniert. Hoffentlich hilft das.

1
Arkham Angel

Die Python Standardbibliothek stellt sched und threading für diese Aufgabe bereit. Dies bedeutet jedoch, dass Ihr Scheduler-Skript die ganze Zeit ausgeführt wird Überlassen Sie die Ausführung dem Betriebssystem, das Ihren Wünschen entspricht oder auch nicht.

0
aepsil0n

Eine Möglichkeit besteht darin, einen C/C++ - Wrapper zu schreiben, der das Skript python regelmäßig ausführt. Ihr Endbenutzer würde die ausführbare C/C++ - Datei ausführen, die im Hintergrund ausgeführt wird, und Führen Sie regelmäßig das Skript python aus. Dies ist möglicherweise nicht die beste Lösung und funktioniert möglicherweise nicht, wenn Sie C/C++ nicht kennen oder diese 100% ige Python-Version beibehalten möchten Dies ist der benutzerfreundlichste Ansatz, da die Benutzer mit dem Klicken auf ausführbare Dateien vertraut sind. Dies setzt voraus, dass python auf dem Computer Ihres Endbenutzers installiert ist.

Eine andere Möglichkeit ist, cron job/Task Scheduler zu verwenden, es jedoch als Skript im Installationsprogramm abzulegen, damit der Endbenutzer es nicht tun muss.

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