Hogyan készítsünk egy ideiglenes hurok verem túlcsordulás az orosz

Lehetséges tartomány (n) használt megismételni valamit n-szer Python:

„Jobb” és „hatékony”, ha ez a módja? Attól függ, hogy az adott problémát.

A kód egyszerű és egyértelmű: ok do_something () függvény 60-szor, minden ezt követő hívás jelentkezik legkorábban egy második befejezése után az előző hívást. Végén vár egy pillanatra, mielőtt befejezte a ciklust.







Tegyünk do_something () függvény átlagosan fél másodpercig, majd a ciklus kerül tizenöt perc, vagy több. Függetlenül attól, hogy jó, ez függ a feladat.

Ha azt szeretnénk, hogy a hívásokat fordul elő a határ minden második:

C-tól a tevékenység más folyamatok, szálak (ütemező szolgáltatást folyamatok / szálak egy operációs rendszer, a végrehajtás jellemzői GIL kiválasztott változat Piton tolmács), minden hívás do_something () más, mint az első jön közel az idő, amikor time.time () visszatér az egész értékek.

Például, ha time.time () függvény X.3 másodperc time.sleep () fog aludni, legalább 0,7 másodpercig (ha a jel felvezető nem dob kivételt), és így a következő hívás do_something () fordulhat elő az X + 1 másodperc Rendszer idő (ha ez nem sok ugrani, míg aludtunk). Ebben az esetben do_something () hívások lehet egyenletesen elosztva, és a ciklus befejeződik majdnem pontosan egy perc szerint time.time () (ha a futási do_something () kevesebb, mint egy másodperc). Függetlenül attól, hogy jó, ez függ a feladat.

Ha nem akarja futtatni do_something (). ha több, mint egy perc telt szerint kiválasztott időzítés, akkor a kifejezett feltétele:

Amik kell figyelembe venni a feladattól függően:

  • Mi a kívánt viselkedést, ha do_something () végezhetjük másodpercnél tovább: ugrás iteráció fut egy külön szál medence szál / folyamatokat?
  • Mi a kívánt viselkedés, ha a rendszer idő ugrások (mert valaki azt lecsukta a laptop alatt ciklus vagy hibernált rendszer bármely más ok miatt következett be, vagy a mobil operációs rendszerhez szállított a folyamat az energiatakarékosság egy idő után, vagy a kódot a VM-nagy ugrások lehetséges). Akár akarjuk, hogy továbbra is a ciklus, mintha semmi sem történt volna, ha a rendszer felébred, vagy törölheti azt követő hívások (elavult), vagy töltse ki a fennmaradó kihívások a lehető leggyorsabban, szünet nélkül, vagy akár egyszerre (határidő lejárt)?






Például, ha az idő változása a végrehajtás során print_some_times () a @ReinRaus választ. mit történt? Garantált, hogy ez a viselkedés sched modul dokumentáció (függetlenül attól, hogy a különböző megvalósítások / változat a Python nem változik)? Fontos ez a konkrét esetben? (Azt hiszem, a világosság az egyszerű ciklus alvó () különösen vonzó ezen a ponton).

Ennek változata a téma lehet periodikusan hívni funkció a háttérben egy vagy használja a képességeit a különböző események ciklus. Bonyolultabb esetekben, ha nincs különösen előnyösek, akkor apscheduler modult kell beágyazni az ütemező az alkalmazásban. Bizonyos esetekben érdemes használni az ütemező rendszer (nagy időközönként), mint például a cron és a Windows Task Scheduler.

Megjegyzés: A régebbi verziója PEP meghatározott eljárás nevű call_repeatedly (). amely megígérte, hogy hívja a visszahívási rendszeres időközönként. Ez azt visszavonták, mert a modell egy ilyen funkció overspecified. Egyrészt, egy egyszerű időzítő hurok könnyen emulálva visszahívási hogy ütemezi át magát a call_later (); ez is könnyű írni coroutine tartalmazó hurok és a sleep () hívás (a toplevel funkciót a modulban, lásd alább). Másrészt, mivel a bonyolult pontos időmérő sok csapdák és buktatók ide a tudatában (lásd PEP 418), és a különböző használati esetek igényelnek a különböző viselkedést szélső esetek. Lehetetlen az API erre a célra, hogy golyóálló minden esetben, tehát úgy kell tekinteni, jobb, ha az alkalmazások tervezői maguk döntsék el, milyen időmérő hurok végrehajtani.

Válaszol október 13 '16 at 07:56

@Max ha jobban megnézed a feltétellel, ciklus, nincs számláló, de van egy határidő. Elolvastam figyelmesen a feltételeket, a probléma - az intervallum 1 másodperc, a hossza 60 másodperc. Természetesen elképzelhető polmilona más körülmények között, de a megfogalmazása e feltételek nem az eredeti feladat. - CHCH október 17 '16 at 10:41