Soru Her saati doğru şekilde çalıştırmak için Python Script Zamanlama


Sormadan önce Cron İşler ve Görev Zamanlayıcısı son seçeneklerim olacak, bu betik Windows ve Linux'ta kullanilacaktir ve bunu yapmak için son kullanicidan ayrilmaktan daha cok kodlu bir yöntem kullanmamayi tercih ederim.

Python için görevleri zamanlamak için kullanabileceğim bir kütüphane var mı? Her saatte bir fonksiyon çalıştırmam gerekecek, ancak her saatte bir komut dosyası çalıştırırsam ve "uyku saatinde", "her saatte bir" gecikme nedeniyle bir önceki günün saatinden farklı bir saatte çalışır komut dosyasını ve / veya işlevi yürütme / çalıştırma özelliğine sahiptir.

Nedir en iyi Belirli bir saatte çalışacak şekilde bir işlev zamanlamanın yolu (birden fazla kez) olmadan Cron Job kullanarak veya Görev Zamanlayıcısı ile zamanlama yaparak?

Ya da bu mümkün değilse, girişinizi de istiyorum.

AP Scheduler ihtiyaçlarınızı tam olarak karşılar.

Sürüm <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')

dışarı:

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

Sürüm> 3.0

(Animesh Pandey'in cevabı aşağıdadır)

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()

36
2018-03-28 14:05


Menşei


Tek mantıklı yol, bir cron işi veya Windows zamanlanmış görev kullanmaktır. Bunu yapmak için son kullanıcıya bırakmanın bir sebebi olmamalıdır: kurulumda cron işi / görevi oluşturmayı betimleyin. - Duncan
Dikkate alınması gerekenler: 1. İşleviniz bir dakika / saatten uzun sürerse ne olur? İkinci örneği başlatır mısın yoksa ilk örneğin tamamlanmasını bekler misiniz yoksa ikinci örneği tamamen iptal eder misiniz (aralığı atla)? 2. Bilgisayar saati geri / ileri (DST veya manüel değişiklik) atlarsa ne olur?: İlgili yürütmeleri tekrarlar / atlar mısınız? 3. Bilgisayar hazırda bekletme modundan uyanırsa ne olur?: Görevi hemen başlatır mısın yoksa sonraki döngüyü çalıştırmak için mi beklersiniz? 4. Cron, Görev Zamanlayıcı, APScheduler bu durumlarda nasıl davrandığını biliyor musunuz? - jfs


Cevaplar:


Belki bu yardımcı olabilir: Gelişmiş Python Zamanlayıcısı

İşte belgelerinden küçük bir kod parçası:

from apscheduler.schedulers.blocking import BlockingScheduler

def some_job():
    print "Decorated job"

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

41
2018-03-28 14:16



Bu benim problemlerimin cevabı gibi görünüyor, çok basit ve kullanımı kolay. Cevabım için bazı test kodlarını ekledim. Tekrar teşekkürler. - sunshinekitty
Sadece bağlantı yanıtı için işaretlenmekten sorumlu olacaksınız. - Aaron Hall♦
Bu sözdizimi artık güncel değil - Jared Beach
Bu <a1> apscheduler </ a1> sürümüyle çalışır. Birisi bize 3.x sürümü gibi basit bir örnek verebilir misiniz? - toscanelli
Tamam, böylece programcı komutu çalıştırdıktan sonra başladı python test_scheduler.py DOS'tan, nasıl durduracağım? Sadece Ctrl + C tuşlarına basarak mı? Programlayıcı 100 kez çalıştırdıktan sonra durmak için zaten var mı? Ya da belirli bir zamanda saat 18:00 de mi? Komut dosyasında nasıl belirtirsiniz. Ben aradım ama kimse onu nasıl durduracağından bahsetmedi. - StayFoolish


Saatte her 10 dakikada bir şeyler çalıştırmak için.

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)

18
2017-10-28 02:15





İçin apscheduler <3.0, bakın Bilinmeyenin cevabı.

İçin 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()

Güncelleştirme:

apscheduler  belgeleme.

Bunun için apscheduler-3.3.1 üzerinde 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()

13
2018-04-04 19:13



Bu çizgi ne anlama geliyor? sched.configure(options_from_ini_file) ini_file nedir ve nasıl yapılandırırsınız? - zsad512
@ zsad512 Sorunuza cevap vermek için örnekler ve referanslar ekledim. - Animesh Pandey


Sunshinekitty tarafından "Sürüm <3.0" olarak adlandırılan sürümde, apscheduler 2.1.2 belirtmeniz gerekebilir. Yanlışlıkla 2,7 yüklememde sürüm 3 vardı, ben de gittim:

pip uninstall apscheduler
pip install apscheduler==2.1.2

Bundan sonra doğru çalıştı. Umarım yardımcı olur.


1
2017-08-29 16:57



Doğru, yazıdaki sürüm, python sürümü değil, apscheduler sürümüne başvurmaktadır. - sunshinekitty


Python standart kütüphanesi sağladı sched ve threading bu görev için. Ancak bu, programlayıcı betiğinizin yürütme işlemini işletim sisteminize bırakmak yerine her zaman çalışıyor olacağı anlamına gelir. Bu, istediğiniz gibi olabilir veya olmayabilir.


0
2018-03-28 14:18



Bir demo görmek güzel olurdu. - Aaron Hall♦
Bağladığım dokümanlarda örnekler var. Ve bahse girerim onlara daha da fazlasını verir. - aepsil0n
Öyleyse, oy istemezsin, ve sadece bağlantıya cevap vermek için işaretlenmeyi tercih edersin? - Aaron Hall♦
Uhm, hayır, gerçekten bir oy kullanmıyorum, sadece bazı işaretçiler sağlamak istedim. O kadar çok mevcut olduğunda, tamamen etli bir örnek sağlama ihtiyacını görmüyorum. Özellikle de OP zaten bir başka çözüme yerleşti. - aepsil0n
Evet, burada bazı kodlar yardımcı olabilirdi, ama burada: stackoverflow.com/questions/3393612/... import threading def printit (): threading.Timer (5.0, printit) .start () print "Merhaba, Dünya!" yazdır() - FredFury


Bir seçenek, düzenli olarak python betiğini yürüten bir C / C ++ sarmalayıcısı yazmaktır. Son kullanıcınız arka planda çalışan C / C ++ yürütülebilir dosyasını çalıştırır ve periyodik olarak python komut dosyasını çalıştırır. Bu en iyi çözüm olmayabilir ve C / C ++ 'yı bilmiyorsanız veya bu% 100 python'u saklamak istiyorsanız çalışmayabilir. Ancak, kullanıcılar yürütücüleri tıklamak için kullanıldığı için en kullanıcı dostu yaklaşım gibi görünüyor. Tüm bunlar, son kullanıcının bilgisayarında python'un kurulu olduğunu varsayar.

Başka bir seçenek de cron job / Görev Zamanlayıcı kullanmak, ancak bir betik olarak bir betik olarak koymaktır, böylece son kullanıcı bunu yapmak zorunda kalmaz.


0
2018-03-28 14:22