Cum de a face o buclă de depășire temporară stivă în limba rusă

interval posibil (n) folosit pentru a repeta ceva de n ori în Python:

„Dreapta“ și „eficientă“ dacă este o cale? Depinde de problema specifică.

Codul este simplă și directă: funcția cauza do_something () de 60 de ori, fiecare apel ulterior nu are loc mai devreme de o secundă după terminarea apelului precedent. La sfârșitul de așteptare pentru un moment înainte de a termina ciclul.







Prezentați do_something () necesită o medie de o jumătate de secundă, atunci ciclul va dura cincisprezece minute sau mai mult. Fie că este bine, depinde de sarcina.

Dacă doriți să efectuați apeluri să aibă loc la limita de fiecare secundă:

C, până la activitatea altor procese, fire (Programatoare caracteristici procese / fire într-un sistem de operare, punerea în aplicare a caracteristicilor GIL versiunea selectată Piton interpret), fiecare apel do_something (), alta decât prima se apropie de momentul când time.time () returnează valorile întregi.

De exemplu, dacă time.time () returnează secunde X.3, time.sleep () va dormi timp de cel puțin 0,7 secunde (în cazul în care handler de semnal nu va arunca o excepție), și, prin urmare, următorul apel do_something () apar la X + 1 secunde Sistem timp (dacă nu este mult omit în timp ce dormeam). În acest caz do_something () apelurile pot fi distribuite mai uniform, iar ciclul este finalizat aproape exact un minut, conform time.time () (în cazul în care do_something de runtime () mai puțin de o secundă). Fie că este bine, depinde de sarcina.

Dacă nu doriți să rulați do_something (). în cazul în care mai mult de un minut a trecut în funcție de timer-ul selectat, puteți utiliza condiția explicită:

Lucruri care trebuie să fie luate în considerare în funcție de sarcina:

  • Ceea ce se dorește un comportament în cazul în care do_something () poate fi efectuat mai mult de doua: sări peste iterație rulează într-un separat fire piscină fir / procese?
  • Care este comportamentul dorit în cazul în care timpul sistemului sare (pentru că cineva a închis capacul laptopului în timpul unui sistem de ciclu sau de hibernare pentru orice alt motiv sa produs sau sistem de operare mobil a expediat procesul la economii de energie după un anumit timp, sau codul în VM-mare salturi sunt posibile). Fie că doriți să continuați ciclul ca și cum nimic nu sa întâmplat, atunci când sistemul se trezește, sau anula apelurile ulterioare (din data), sau de a completa provocările rămase cât mai repede posibil, fără pauză sau chiar dintr-o dată (termenul limită a trecut)?






De exemplu, în cazul în care schimbarea de timp în timpul print_some_times de execuție () a răspunsului @ReinRaus. Ce se întâmplă? Garantat dacă acest comportament sched documentație modul (dacă este între implementări diferite / versiuni de Python nu se va schimba)? Este important în cazul dvs. particular? (Cred că claritatea ciclului simplu, cu somn () poate fi deosebit de atractiv în acest punct).

Ca o variație pe tema poate fi periodic apela funcția într-un fir de fundal sau de a folosi capacitățile de cicluri de diferite evenimente. În cazuri mai complexe, în cazul în care aveți nici o preferință specială, puteți utiliza modulul apscheduler pentru a încorpora planificator în aplicația dumneavoastră. În unele cazuri, este logic să utilizeze sistemul planificator (pentru intervale mari), cum ar fi cron și Windows Task Scheduler.

Notă: O versiune anterioară a acestei PEP definit o metodă numită call_repeatedly (). care a promis pentru a apela un apel invers, la intervale regulate. Acest lucru a fost retras, deoarece proiectarea unei astfel de funcții este overspecified. Pe de o parte, o buclă de cronometru simplu poate fi ușor emulat folosind un apel invers, care se eșalonează folosind call_later (); de asemenea, este ușor de a scrie coroutine care conține o buclă și un apel de somn () (o funcție toplevel în modulul, vezi mai jos). Pe de altă parte, din cauza complexității cronometrie exacte, există multe capcane și capcane aici pentru necunoscatori (a se vedea PEP 418), precum și diferite cazuri de utilizare necesită un comportament diferit în cazuri de margine. Este imposibil de a oferi un API pentru acest scop, care este glonțului, în toate cazurile, așa că se consideră mai bine pentru a permite designerilor de aplicații să decidă pentru ei înșiși ce fel de buclă cronometru pentru a pune în aplicare.

Răspuns 13 '16 octombrie, la 07:56

@Max dacă te uiți atent la starea, ciclul, nu există nici un contor, dar există o limită de timp. Am citit cu atenție condițiile problemei - intervalul de 1 secundă, lungimea de 60 de secunde. Desigur, este posibil să se prevadă polmilona alte condiții, dar în formularea acestor condiții nu este sarcina originală. - CHCHs 17 octombrie '16, la 10:41