Ü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 * * * * .....
- 1171 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
igen, de ez változó. Tehát nem fix a job ideje.
Konkrétan szenzorok mérnek értékeket és ezek mérési ideje nem mindig ugyanannyi.
Elegáns lenne, ha mindig :00 :15 :30 :45 perckor mérne vagy legalábbis akkor kezdené.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nem értem miért probléma, hogy változik a job futási ideje. Ezért kell megmérni.
- A hozzászóláshoz be kell jelentkezni
Igen és nem kell a schedule modul.
- A hozzászóláshoz be kell jelentkezni
Mi a baj a schedule modullal?
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Nincs baj vele, csak akkor nincs rá szükség. :) Ahogy a téma indítóban is céloztam rá.
A kérdés arra vonatkozott, hogy a schedule modullal (vagy esetleg más modullal) meg lehet-e oldani a pontos időzítést ugyanígy.
- A hozzászóláshoz be kell jelentkezni
Ja, értem:-)
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
+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())`)
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni