Как да направите преливане временна линия комин на Руски

Възможен обхват (н) се използва, за да се повтори нещо н пъти в Python:

"Право" и "ефективно", ако това е така? Това зависи от конкретния проблем.

Кодът е проста и ясна: функция причина do_something () 60 пъти, всеки следващ разговор се случва не по-рано от една секунда след приключване на предишния разговор. В края на изчакване за момент, преди да завършите цикъла.







Въвеждане do_something () изисква средно по половин секунда, след което цикълът ще се петнадесет минути или повече. Дали това е добро, това зависи от задачата.

Ако искате да провеждате разговори да се случи на границата на всяка секунда:

С до дейността на други процеси, нишки (Schedulers разполага процеси / теми в една операционна система, изпълнението на функции ГИЛ избран версия Питон преводач), всяко повикване do_something (), различно от първото се доближава до времето, когато time.time () връща стойности на цели числа.

Например, ако time.time () връща X.3 секунди, time.sleep () ще спят в продължение на най-малко 0,7 секунди (ако водачът на сигнала, няма да се хвърли изключение), и следователно следващата do_something повикване () се срещат в X + Система за 1 секунда време (не, ако тя е много пропуснати, докато ние спяхме). В този случай do_something () може да има обаждания по-равномерно разпределена и цикълът е завършен почти точно една минута, в съответствие time.time () (ако по време на работа do_something () по-малко от една секунда). Дали това е добро, това зависи от задачата.

Ако не искате да стартирате do_something (). ако повече от минута премина в съответствие с избрания таймер, можете да използвате при изричното условие:

Неща, които трябва да бъдат взети под внимание в зависимост от задачата:

  • Какво е желано поведение, ако do_something () може да се извърши повече от втория: пропуснете повторение серия в отделна нишка басейн конци / процеси?
  • Какво е най-желаното поведение, ако системното време скача (защото някой се е затворила капака на лаптопа по време на цикъл или хибернация система по някаква друга причина е настъпило или мобилна операционна система е превозват процеса на спестяване на енергия след известно време, или кода в рамките на ВМ-голям скокове са възможни). Независимо дали искате да продължите цикъла, сякаш нищо не се е случило, когато системата се събужда, или да анулира последващи разговори (от дата), или да завърши оставащите предизвикателства възможно най-бързо, без пауза или дори всички наведнъж (краен срок мина)?






Например, ако смяната на времето по време на изпълнение print_some_times () на отговор @ReinRaus. какво ще се случи? Гарантирано дали това поведение sched документация модул (независимо дали е между различните приложения / версии на Python няма да се промени)? важно във вашия конкретен случай ли е? (Мисля, че яснотата на прост цикъл на съня () може да бъде особено привлекателен в този момент).

Като вариант на темата може да бъде периодично извикване на функция във фонов нишка или да използвате възможностите на различни събития цикли. В по-сложни случаи, ако нямате специално предпочитания, можете да използвате apscheduler модул за вграждане планировчика в молбата Ви. В някои случаи, че има смисъл да се използва системата за планировчика (за големи интервали от време), като Cron и Windows Task Scheduler.

Забележка: предишна версия на този PEP дефиниран метод, наречен call_repeatedly (). който обеща да се обади за обратно повикване на редовни интервали. Това е било оттеглено поради дизайна на такава функция се overspecified. От една страна, прост таймер линия може лесно да бъде емулирана използване на обаждане, която се reschedules използване call_later (); също така е лесно да се напише coroutine съдържащ една линия и на повикване сън () (а най-високо ниво функция в модула, вижте по-долу). От друга страна, поради сложността на точна Основния има много капани и клопки тук за нехайните (виж PEP 418), както и различните случаи на употреба изискват различно поведение в случаи на ръба. Невъзможно е да се предложи API за тази цел, което е непробиваем във всички случаи, така че се счита за по-добре да споделите с дизайнерите на приложения сами да решат какъв вид таймер контур за изпълнение.

Отговорено 13 '16 октомври в 07:56

@Max ако се вгледате внимателно в състояние, цикъл, няма брояч, но има ограничение във времето. Аз прочетох внимателно условията на проблема - интервал от 1 секунда, дължината на 60 секунди. Със сигурност може да се предвиди polmilona други условия, но при формулирането на тези условия не е първоначалната задача. - СН-17 октомври '16 в 10:41