Python schedule - pontos időközönként

Üdv!
A korábbi témában már megoldódott a python script indítása: https://hup.hu/node/161767
Egy dolog merült fel, hogy a schedule-ben (schedule modul) beállított időzítő érték úgy működik, hogy az "ismétlődési idő" a korábban befejezett ismétlődéstől számolódik.
Pl.:
* job-ot futtatok 15 percenként egész órától kezdve, akkor így fut:
12:00:00
12:15:00
12:30:00

Pontosabban ez csak az elmélet, mert magának a job-nak is van egy futási ideje és az hozzáadódik, tehát a valóságban egy idő után pár másodpercet elcsúszik az egész időzítés, pl.:
12:00:00
12:15:00
...
14:00:01
14:15:01
...
17:00:02
17:15:02

Ez nem akkora probléma, de jobb lenne, ha a 15 perces időzítés az mindig pontosan 15 percenként indulna. Ez megoldható python-ban valahogy?
A cron-ban tudom megoldható, mert a rendszer cron-ja mindig 15 percenként fogja indítani: */15 * * * * .....

Hozzászólások

Persze! Csak mérd le a job futási idejét és korrigáld vele az időzítést. Mérés alatt azt értem, hogy a szkript elején/végén lekérdezed a pontos időt (akár us pontossággal) és a különbségüket veszed.

Egy Arduino projektből kiollózva:


sleepDelay = SLEEP_DELAY - ((minute()*60+second()) % SLEEP_DELAY)+5;
if (sleepDelay < 30) sleepDelay += SLEEP_DELAY;

SLEEP_DELAY -> az ismétlődés ideje másodpercben (nálam 300s)
A +5-ös érték tapasztalati, nekem még ennyi kell hozzá, hogy az eszköz felébredjen, lemérje a mérendőket és elküldje az adatot a webszervernek.
A plusz sor miatt nem küld gyorsan adatot egymás után az első bekapcsoláskor.

--
Dell Latitude 5480, Arch Linux & Xfce

Valami ilyesmi?
1. várok időpontra
2. kiszámolom az új időpontot
3. csinálom amit kell
4. goto 1

Ha a futásidő garantáltan rövidebb, mint a periódus, akkor jónak kell lennie. Ha nem elég pontos (pl már most is ezt csinálod), akkor 2. -ban lehet számolni késést (aktuális idő - várt időpont), és a számított értékkel korrigálni a következő időpontot. Az jó kérdés, milyen algoritmust érdemes választani a korrekcióhoz, hogy pontos legyél. Elsőre valami PID jellegű dologra gondolnék, de ezt igazából csak a követelmények ismeretében (mennyire kell pontos legyen) lehet eldönteni. Az is kérdés, hogy mire kell tudjon a "rendszer" reagálni. Pl. kell e tudni kompenzálni a változó CPU terhelésből adódó futásidő változást. Az is kérdéses átlagban kell e jó legyen, vagy minden indítás a lehető legpontosabb kell e legyen. Pl: Win 95 küldött sorozatban több az timer eseményt az alkalmazásnak ha lemaradt, hogy az "átlag" meglegyen. Azaz az adott időegységre jutó timer események száma hosszabb távon állandó volt, de rövid távon voltak durva kilengések.

Miert fix a sleep parametere? Tudod, hogy mikor kellene futnia, ezt letarodlod . Majd mielott elmegy sleep-be, megkerdezed, hogy mennyi most az ido. A ketto kulonbsegevel meg elkuldod aludni.

+1. Pontosan ezt kell csinalni. Kozonseges mezei shell-ben pont ezt es/vagy ilyesmit szoktam:


#!/bin/bash

period=60

while true; do
        time=`date +%s`
        wait=$((period-(time%period)))
        sleep $wait
        date
        sleep $((RANDOM%3+1))
done

(itt az utolso sleep szimulalja azt hogy valami random ideig futo dolog tortenik periodikusan)

Ez tok egyszeruen atultetheto python-ban is, lenyeg hogy az unix timestamp-et kerdezd le, es ha egesz szamokra kerekited akkor tkp meg egyszerubb is (lasd: `import time; int(time.time())`)

Miért nem küldesz egy bugreportot ennek a Python schedule írójának, hogy ne másszon el az időzítés? Amúgy az előző témában megválaszoltam, hogy lehet minden óra :00-kor futtatni, és szerintem akkor nem mászik el, mert a következő futási időpont a fix és nem az alvás mennyisége. Ugyanezt eljátszhatod :15, :30, :45 időzítéssel és kész.