Как запускать программу с интервалом

Нужно сделать цикл, который будет минуту выполнять функцию с промежутком в 1 сек. Какой способ самый эффективный? Не смог придумать ничего лучше этого:

from time import sleep seconds_left = 60 while seconds_left > 0: do_something() seconds_left -= 1 sleep(1)
Отслеживать
8,542 4 4 золотых знака 29 29 серебряных знаков 53 53 бронзовых знака
задан 13 окт 2016 в 0:40
Trajectory Trajectory
181 3 3 золотых знака 4 4 серебряных знака 11 11 бронзовых знаков

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Можно range(n) использовать, чтобы повторить что-то n раз в Питоне:

for _ in range(60): do_something() time.sleep(1)

«Правильный» и «эффективный» ли это способ? Это зависит от конкретной задачи.

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

Представьте do_something() требует полсекунды в среднем, тогда цикл займёт полторы минуты или больше. Хорошо ли это—зависит от задачи.

Надпись ТО на Экране Каптюр. Как Сбросить Межсервисный Интервал РЕНО КАПТУР

Если вы хотите, чтобы вызовы происходили бы на границе каждой секунды:

for _ in range(60): do_something() time.sleep(1 — time.time() % 1)

C точностью до активности других процессов, потоков (особенностей планировщиков процессов/потоков в операционной системе, особенностей GIL реализации выбранной версии Питон-интерпретатора), каждый вызов do_something() кроме первого происходит близко ко времени, когда time.time() целые значения возвращает.

К примеру, если time.time() вернёт X.3 секунд, то time.sleep() будет спать не менее 0.7 секунд (если обработчик сигналов исключение не выбросит) и значит следующий вызов do_something() произойдёт в X + 1 секунд по системному времени (если оно сильно не прыгнуло пока мы спали). В этом случае вызовы do_something() могут быть более равномерно распределены и цикл завершится почти ровно через минуту согласно time.time() (если время выполнения do_something() менее секунды). Хорошо ли это—зависит от задачи.

Если вы не хотите запускать do_something() , если больше минуты прошло согласно выбранному таймеру, можно явное условие использовать:

deadline = time.monotonic() + 60 while time.monotonic() < deadline: do_something() time.sleep(1)

Вещи, которые необходимо принять во внимание в зависимости от задачи:

  • Какое желаемое поведение, если do_something() может выполняться больше секунды: пропустить итерацию, запустить в отдельном потоке, пуле потоков/процессов?
  • Какое желаемое поведение, если системное время прыгнет (потому что кто-то закрыл крышку ноутбука во время цикла или hibernation системы по любой другой причине произошло или мобильная OS отгрузила ваш процесс, чтобы энергию сэкономить через какое-то время, или код внутри VM—большие прыжки возможны). Хотите ли вы продолжить выполнение цикла как будто ничего не произошло, когда система проснётся, или отменить последующие вызовы (устарели), или выполнить оставшиеся вызовы как можно быстрее, без паузы или вообще все сразу (deadline прошёл)?

В качестве вариации на тему, можно периодически вызывать функцию в фоновом потоке или использовать возможности различных циклов событий. В более сложных случаях, если у вас нет особых предпочтений, можно использовать apscheduler модуль, чтобы встроить планировщик в ваше приложение. В каких-то случаях имеет смысл воспользоваться планировщиком системы (для больших интервалов) таких как cron и Windows Task Scheduler.

Запуск макроса по времени

Читайте также:
Как называются программы предназначенные для обработки текста

Полезно знать причины, по которым call_repeatedly() функцию убрали из PEP 3156 — Asynchronous IO Support Rebooted: the «asyncio» Module:

Note: A previous version of this PEP defined a method named call_repeatedly() , which promised to call a callback at regular intervals. This has been withdrawn because the design of such a function is overspecified. On the one hand, a simple timer loop can easily be emulated using a callback that reschedules itself using call_later() ; it is also easy to write coroutine containing a loop and a sleep() call (a toplevel function in the module, see below). On the other hand, due to the complexities of accurate timekeeping there are many traps and pitfalls here for the unaware (see PEP 418), and different use cases require different behavior in edge cases. It is impossible to offer an API for this purpose that is bullet-proof in all cases, so it is deemed better to let application designers decide for themselves what kind of timer loop to implement.

Источник: ru.stackoverflow.com

1С 8.x : Периодическое выполнение кода с заданным интервалом времени — ОбработкаОжидания()

Распечатать

Параметры:
(обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
(обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число).Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
(необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания.
Истина — указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь
Описание: Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Тонкий клиент, веб-клиент, толстый клиент.

Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания. Код 1C v 8.2 УП

ОтключитьОбработчикОжидания()

КонецПроцедуры

ОболочкаОбработчика», 3, Истина);
ПодключитьОбработчикОжидания(, , )

Подключает вызов указанной процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля через определенный интервал времени. Вызов будет осуществляться только в «состоянии покоя», то есть в тот момент, когда программа не выполняет никаких действий. Вызов обработчика ожидания продолжается, пока система не завершит работу или пока не будет вызван метод глобального контекста ОтключитьОбработчикОжидания.
Код 1C v 8.х

Процедура ОтчетОпродажахЗаДень()
// .
КонецПроцедуры

//.
ПодключитьОбработчикОжидания(«ОтчетОпродажахЗаДень», 60); // каждую минуту

Код 1C v 8.х
// В типовых проверка дин. обновления конфигурации каждые 20 мин.
ПодключитьОбработчикОжидания(«ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ», 20 * 60);
// подключим обработчик обменов данными
ПодключитьОбработчикОжидания(«ПроверкаОбменаДанными», глЗначениеПеременной(«глКоличествоСекундОпросаОбмена»));
///
ПодключитьОбработчикОжидания(«ПроверитьОтветыНаЗаявленияНаПодключение», 86400); // = 24(ч) * 60(мин) * 60(сек) = 1 сутки

Для Формы
Код 1C v 8.х

ПодключитьОбработчикОжидания(, , )

Параметры:
(обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
(обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число). Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
(необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания. 0Истина — указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь

Описание:
Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Толстый клиент.
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания.
Пример:
Код 1C v 8.х

Читайте также:
Как сохранить документ в программе ворд

ПодключитьОбработчикОжидания(«ПриОжидании», 1);

Код 1C v 8.х
Форма.мИнтервалАвтосохранения = 300; // 5 минут
Если Форма.мИнтервалАвтосохранения <> 0 Тогда
Форма.ПодключитьОбработчикОжидания(«ОбработчикСобытияПоТаймеру», Цел(Форма.мИнтервалАвтосохранения * 60));
КонецЕсли;

Обработка ожидания в системе 1С:Предприятие, как следует из документации, предназначена для периодического выполнения процедуры глобального модуля с заданным интервалом времени. Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x

ОбработкаОжидания(«ОбновитьСчетчик_»,1);

Где «ОбновитьСчетчик_» — имя процедуры глобального модуля, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)

Но! Проблема в том, что запустить обработку ожидания можно только 1 раз. Повторный запуск приведет к отмене предыдущего. Другими словами, если Вы хотите сделать, к примеру, обработку-таймер для отсчета затраченного времени, то запустить можно только один таймер, т.к. запуск второго таймера приведет к остановке первого. А что делать если Вам надо запустить 2, 3 или больше таких таймеров одновременно? Или Вам надо еще при этом периодически сканировать состояние документов?

Выход есть! Обработку ожидания надо запустить в контексте формы, чтобы отделить этот поток от глобального контекста. И тогда станет возможным периодический запуск процедуры локального модуля, т.е. процедуры, расположенной в модуле формы Вашей обработки.

Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x

Форма.ОбработкаОжидания(«ОбновитьСчетчик_»,1);

Где «ОбновитьСчетчик_» — имя процедуры локального модуля формы обработки, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)
Таким образом, в каждой обработке можно запустить свою обработку ожидания, которая будет работать до тех пор, пока открыта форма.

В формах можно использовать Код 1C v 8.х

Форма.ОбработкаОжидания(«ИмяПроцедуры»,ВремяЗапуска)

,
где ИмяПроцедуры — имя процедуры, которая запускается через ВремяЗапуска секунд
В самой процедуре нужно вставить Код 1C v 8.х

Форма.ОбработкаОжидания(«ИмяПроцедуры»,0)

для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник lessons1c
:

Разместил: E_Migachev Версии: | 7.x | 8.x | 8.2 УП | Дата: 30.10.2012 Прочитано: 142852

Распечатать

Возможно, вас также заинтересует

Похожие FAQ

10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает 🙂 И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server 20
Данное обстоятельство может быть обусловлено многими причинами. Одна из них — неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » — конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих

Еще в этой же категории

Полнотекстовый поиск в 1С (что это и пример использования) 27
Полнотекстовый поиск — позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, » ЧЦ=10; ЧДЦ=2″ ); // ЗначФормат = » 123 456,79″ ЗначФормат = Формат(123456.789, » ЧГ=0; ЧДЦ=2″ ); // Знач Обработчики событий при записи объектов. Зачем и что за чем? 18
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения 12
» Момент времени» — виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М УстановитьСсылкуНового 12
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к Посмотреть все в категории Встроенные Функции

Читайте также:
Программа для использования телефона как модем через USB

Источник: helpf.pro

Как запускать команду Linux каждые X секунд навсегда

Вы когда-нибудь были в ситуации, когда вам приходилось несколько раз запускать определенную команду Linux?

Ну, если вы еще не знаете , этот учебник научит вас, как это сделать.

Конечно, вы можете сделать это, используя скрипт оболочки или задания cron.

Кроме того, вы можете повторить команду Linux с определенным интервалом без необходимости вручную запускать ее каждый раз.

Вот где команда Watch пригодится.

Эта команда может использоваться для повторного выполнения данной команды и контроля вывода в полноэкранном режиме.

Чтобы выразить это простыми словами, мы можем использовать команду Watch для запуска команды Linux каждые X секунд навсегда, и команда будет продолжать отображать вывод в консоли до тех пор, пока мы не остановим ее вручную, нажав CTRL + C, или убейте процесс или заставьте систему перезагрузится .

По умолчанию программа запускается каждые 2 секунды, или вы можете определить временной интервал по вашему выбору.

Запуск команды Linux каждые X секунд

Синтаксис команды watch:

$ watch [options] command

Ниже я привел пять примеров, объясняющих, где вы можете использовать команду watch для повторного запуска определенных команд Linux.

Пример 1:

Скажем, вы хотите запустить команду «uptime» каждые 2 секунды, чтобы контролировать время безотказной работы вашей системы.

Для этого просто запустите:

$ watch uptime
Every 2.0s: uptime sk Wed Feb 9 20:14:46 2018 20:15:46 up 2:38, 1 users, load average: 0.41, 0.35, 0.46

  • Every 2.0s: время безотказной работы – команда «uptime» запускается каждые 2 секунды и отображает результат.
  • sk – текущий пользователь
  • Wed Feb 9 20:14:46 2018 – текущая дата и время, когда мы выполнили команду.

Это будет продолжаться до тех пор, пока вы не закончите вручную.

Чтобы выйти из команды, нажмите CTRL + C.

$ watch `uptime` > uptime.txt

Это может быть полезно, если вы хотите отправить время безотказной работы вашей системы на техническую поддержку для получения справки.

Пример 2

Как я упоминал ранее, команда watch выполняет программу каждые 2 секунды по умолчанию.

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru