Üdv!
Azt szeretném python3-ban megoldani, hogy ha elindul a script, akkor várjon a legközelebbi egész óráig (00 percig).
Ezt mivel lehet megoldani elegánsan?
Próbálkoztam a time csomaggal:
import time
starttime=time.time()
print(starttime)
# time.sleep(3600.0 - ((time.time() - starttime) % 3600.0)) <--- ide kellene a megfelelő sleep
- 1670 megtekintés
Hozzászólások
Nem értek a kígyókhoz, de az biztos, hogy modulo-t float operandussal kell számolni? Azért kérdem, mert ez épp egy olyan művelet, amelynek egész számokon van értelme.
Ami a tartalmát illeti, szerintem nem kell a start time. Most valamennyi az idő, s 3600-ból kivonod a pillanatnyi idő mod 3600-at, akkor kapod meg, hogy mennyi idő van még a következő egész óráig. Esetleg, ha épp 3600 az eredmény, akkor kihagyhatod az időzítést, mert pont egész óra van.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Köszi, igazad van:
import time
import datetime
print(datetime.datetime.now())
starttime=time.time()
timetowait=3600-(starttime%3600)
print(starttime)
print(timetowait)
time.sleep( timetowait )
print ("tick")
print(datetime.datetime.now())
- A hozzászóláshoz be kell jelentkezni
Mehet floattal, mert a % is és a time.sleep() is kezeli:
import time
time.sleep(3600.0 - time.time() % 3600.0)
--
$ grep -c egy$ word.list
100
- A hozzászóláshoz be kell jelentkezni
Az lehet, hogy tudja, csak minek, amikor nem fűződik hozzá cél, nem optimális, ráadásul vitatható az értelme és leírni is hosszabb.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Igazad van, nem írnék oda floatot én sem, anélkül is float lesz a kifejezés és az a lényeg, hogy a sleep floatot kapjon.
Csak jelezni akartam, hogy a % után állhat float:
>>> 25.5 % 5.5
3.5
>>> (25.5 - 3.5) / 5.5
4.0
--
$ grep -c egy$ word.list
100
- A hozzászóláshoz be kell jelentkezni
És ez hogyan jön ki?
Szerintem:
25/5.5=~4.54545454545454545455
0.54545454545454545455*5.5=3
Ami meg nem három és fél.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
25.5/5.5 = 4.6363, ennek az egészrésze 4
Ha ezt kivonod belőle: 25.5-4*5.5=3.5
Vagy, próbáld ki ezt: (255%55)/10
De erre érdemes figyelni: https://stackoverflow.com/q/14763722/552139
- A hozzászóláshoz be kell jelentkezni
Csak nem tudok olvasni. Valamiért én 25-ről beszéltem 25.5 helyett... :(
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A CRON miért nem jó erre? Beállítod, hogy minden egész órában fusson le a Python script.
- A hozzászóláshoz be kell jelentkezni
Mert nem minden egész órában szeretném, hanem csak egyszer, induláskor. A lényeg, hogy várja meg a következő egész órát.
Utána fut majd az "ütemezőm", ami futtatja a megfelelő algoritmust.
- A hozzászóláshoz be kell jelentkezni
ha maskepp nem sikerul, akkor ugy is megoldhatod hogy a scripted elinditasakor csinal egy flag filet es a cron orankent inditott scriptje ezt a filet figyeli. ha letezik akkor csinalod amit kell, majd torlod a flag filet.
- A hozzászóláshoz be kell jelentkezni
Bár OS-ről nem volt szó én Linuxban gondolkodtam. A Linux pedig ezeket tökéletesen megoldja. Nem derül ki miért akarsz saját ütemezőt, miért nem jók a meglévő megoldások. Azért írom így, mert sokszor találkoztam azzal, hogy a fejlesztők amikor kell valami lefejleszti magának ahelyett, hogy használná a meglévő és valljuk be jól bevált és kiforrott megoldásokat. Egy frissen fejlesztett ütemezőnél mindig nagyobb az esélye egy-egy rejtett hibának például.
A fenti tapasztalatim alapján azt mondanám, hogy a Python kód beillesztene egy JOB-ot mondjuk az AT parancsba ha egyszer kell futni és ha periodikusan kell akkor ott a CRON.
- A hozzászóláshoz be kell jelentkezni
Ha nem kell normális scheduler, akkor akár egy ilyesmi is elég lehet:
from threading import Timer
from datetime import datetime, timedelta
def on_sched():
print('Running at', datetime.now())
target_time = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)
Timer((target_time - datetime.now()).total_seconds(), on_sched).start()
- A hozzászóláshoz be kell jelentkezni
"megoldani elegánsan"
Szerintem ne egy időintervallumot várj, hanem regisztrálj be valamit, hogy egy adott időpontban fusson a dolog.
Mi van ha átállítják az órát?
- A hozzászóláshoz be kell jelentkezni
Én úgy indulnék el, hogy indításkor megkeresem a következő egész órát, pl.:
/szerk.: a pandas példa nem jó, helyette itt van egy jó round up megoldás:
https://stackoverflow.com/questions/48107644/rounding-datetime-to-the-n…
Majd a legegyszerűbben talán a schedule konyvtarral lefuttatod a fent megkapott időn: https://pypi.python.org/pypi/schedule
Ha ismert lenne a teljes igény, lehet tudnék jobb megoldást is.
-------------------------
Roses are red
Violets are blue
Unexpected '}' on line 32
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek, de ahogy korábbi a hozzászólásban jeleztem, ez működik (thanx locsemege!):
# print(datetime.datetime.now())
starttime=time.time()
timetowait=3600-(starttime%3600)
time.sleep( timetowait )
A lényeg az volt, hogy egész órában szeretném a futást kezdeni, utána pedig a schedule csomaggal/modullal már tudom ütemezni a job-okat.
- A hozzászóláshoz be kell jelentkezni
:)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Már csak egy kérdés maradt: Ha egyszer van "saját ütemeződ", akkor miért nem tud ütemezni egész órában? Mennyiben más feladat később ütemezni, mint indításkor?
- A hozzászóláshoz be kell jelentkezni
Mert induláskor csak egyszer kell az időzítés! A schedule modulban nem találtam ilyen opciót.
- A hozzászóláshoz be kell jelentkezni
Nem ezt kerested? https://github.com/dbader/schedule/blob/master/test_schedule.py#L102
- A hozzászóláshoz be kell jelentkezni
Megnézem, de nem biztos, hogy ez lenne az. Ezt mintha néztem volna...
De köszönöm az ötletet!
- A hozzászóláshoz be kell jelentkezni