Как сделать задержку в python
Перейти к содержимому

Как сделать задержку в python

  • автор:

How to timeout in Python

Timeout is very useful when you want to limit the max time for calling a function or running a command. Here are my two Python implementations. (I’m using Python 3.6.5).

Use multiprocessing to timeout a Python function

Use one process to keep time/check timeout and another process to call this Python function.

The output is as follows. The exit code tells whether the function is a timeout (exitcode=None) or finished.

Use subprocess to timeout an external command

Since Python 3.5, there’s a handy and recommended run() API in subprocess module, which has built-in timeout support.

When timeout, it raises a TimeoutExpired exception.

For UNIX, there’s another way to use the signal module to signal a handler to raise an exception after 5 seconds, but I think it’s a little low-level and not straightforward.

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Python: сделать временную задержку (спящий режим) для выполнения кода

Введение Задержка кода (также известная как «спящий») — это именно то, что подразумевает название, задержка выполнения кода на некоторое время. Наиболее частая потребность в отложении кода — это когда мы ждем завершения какого-либо другого процесса, чтобы мы могли работать с результатом этого процесса. В многопоточных системах потоку может потребоваться дождаться, пока другой поток закончит операцию, чтобы продолжить работу с этим результатом. Другой пример — уменьшение нагрузки на сервер, над которым мы работаем.

Время чтения: 8 мин.

Вступление

Задержка кода (также известная как « спящий» ) — это именно то, что подразумевает название, задержка выполнения кода на некоторое время. Наиболее частая потребность в отложении кода — это когда мы ждем завершения какого-либо другого процесса, чтобы мы могли работать с результатом этого процесса. В многопоточных системах потоку может потребоваться дождаться, пока другой поток закончит операцию, чтобы продолжить работу с этим результатом.

Другой пример — снижение нагрузки на сервер, с которым мы работаем. Например, при парсинге веб-страниц (этически) и соблюдении ToS рассматриваемого веб-сайта с соблюдением robots.txt — вы вполне можете отложить выполнение каждого запроса, чтобы не перегружать ресурсы сервера.

Многие запросы, отправляемые в быстрой последовательности, могут, в зависимости от рассматриваемого сервера, быстро задействовать все свободные соединения и фактически превратиться в DoS-атаку . Чтобы дать передышку, а также чтобы убедиться, что мы не оказываем негативного воздействия ни на пользователей веб-сайта, ни на сам веб-сайт — мы ограничили количество отправляемых запросов, задерживая каждый из них.

Студент, ожидающий результатов экзамена, может яростно обновлять сайт своей школы в ожидании новостей. В качестве альтернативы они могут написать сценарий, который проверяет, есть ли на веб-сайте что-нибудь новое. В некотором смысле, задержка кода технически может стать планированием кода с допустимым циклом и условием завершения — при условии, что действующий механизм задержки не блокирует .

В этой статье мы рассмотрим, как отложить выполнение кода в Python — также известное как спящий режим . Это можно сделать несколькими способами:

Код задержки с time.sleep ()

Одним из наиболее распространенных решений проблемы является функция sleep() встроенного модуля time Он принимает количество секунд, в течение которых процесс должен засыпать — в отличие от многих других языков, которые основаны на миллисекундах :

Совершенно ясно, что мы можем видеть задержку в 5 секунд между двумя print() с довольно высокой точностью — вплоть до второго десятичного знака. Если вы хотите спать менее 1 секунды, вы также можете легко передать нецелые числа:

Однако имейте в виду, что с двумя десятичными знаками продолжительность сна может быть не совсем точной , особенно из-за того, что ее трудно проверить, учитывая тот факт, что print() требуют некоторого (переменного) времени для выполнения.

time.sleep() есть один серьезный недостаток, очень заметный в многопоточных средах.

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

Еще одно замечание о time.sleep() — это то, что вы не можете его остановить. После запуска вы не можете отменить его извне, не завершив всю программу или sleep() генерировать исключение, которое остановило бы его.

Асинхронное и реактивное программирование

Асинхронное программирование вращается вокруг параллельного выполнения, когда задача может выполняться и завершаться независимо от основного потока.

В синхронном программировании — если функция A вызывает функцию B , она останавливает выполнение до тех пор, пока функция B не завершит выполнение, после чего функция A может возобновиться.

В асинхронном программировании — если функция A вызывает функцию B , независимо от ее зависимости результата от функции B , обе могут выполняться одновременно, и, если необходимо, дождаться завершения другой, чтобы использовать результаты друг друга.

Реактивное программирование — это подмножество асинхронного программирования , которое запускает выполнение кода реактивно , когда данные представлены, независимо от того, занята ли функция, которая должна их обрабатывать. Реактивное программирование в значительной степени опирается на архитектуры, управляемые сообщениями (где сообщение обычно является событием или командой ).

И асинхронные, и реактивные приложения сильно страдают от блокировки кода, поэтому использование чего-то вроде time.sleep() для них не подходит. Давайте посмотрим на некоторые варианты задержки неблокирующего кода.

Код задержки с asyncio.sleep ()

Asyncio — это библиотека Python, предназначенная для написания параллельного кода и использующая async / await , который может быть знаком разработчикам, которые использовали его на других языках.

Установим модуль через pip :

После установки мы можем import его в наш скрипт и переписать нашу функцию:

При работе с asyncio мы помечаем функции, которые выполняются асинхронно, как async , и await результатов таких операций, как asyncio.sleep() которые будут завершены в какой-то момент в будущем.

Как и в предыдущем примере, это будет напечатано два раза с интервалом в 5 секунд:

Хотя на самом деле это не иллюстрирует преимущества использования asyncio.sleep() . Давайте перепишем пример для параллельного выполнения нескольких задач, где это различие гораздо более ясно:

Здесь у нас есть async функция, которая имитирует трудоемкую задачу, выполнение которой занимает 5 секунд. Затем, используя asyncio , мы создаем несколько задач . Однако каждая задача может выполняться асинхронно, только если мы вызываем их асинхронно. Если бы мы запускали их последовательно, они также выполнялись бы последовательно.

Для их параллельного вызова мы используем gather() , которая собирает задачи и выполняет их:

Все они выполняются одновременно, и время ожидания для трех из них не 15 секунд, а 5.

С другой стороны, если бы мы настроили этот код, чтобы вместо time.sleep()

Мы будем ждать 5 секунд между каждым оператором print()

Код задержки с таймером

Класс Timer — это Thread , который может запускать и выполнять операции только по прошествии определенного периода времени. Это именно то, что мы ищем, хотя использование Thread s для задержки кода является излишним, если вы еще не работаете с многопоточной системой.

Класс Timer должен быть start() , и его можно остановить с помощью cancel() . Его конструктор принимает целое число, обозначающее количество секунд ожидания перед выполнением второго параметра — функции.

Создадим функцию и выполним ее через Timer :

Метод cancel() очень удобен, если у нас работает несколько функций, и мы хотели бы отменить выполнение функции на основе результатов другой или другого условия.

Напишем функцию f() , которая вызывает как f2() и f3() . f2() вызывается как есть — и возвращает случайное целое число от 1 до 10, имитируя время, необходимое для запуска этой функции.

f3() вызывается через Timer и если результат f2() больше 5 , f3() отменяется, тогда как если f2() выполняется в «ожидаемое» время меньше 5 — f3() запускается после таймер заканчивается:

Выполнение этого кода несколько раз будет выглядеть примерно так:

Код задержки с событием

Класс Event можно использовать для генерации событий. Одно событие может быть "прослушано" несколькими потоками. Функция Event.wait() блокирует поток, в котором она находится, за исключением Event.isSet() . После того, как вы set() событие, все ожидающие потоки пробуждаются, и Event.wait() становится неблокирующим .

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

Давайте создадим waiter и запустим его несколько раз в разных потоках. Каждый официант начинает работать в определенное время и каждую секунду проверяет, работают ли они еще час, прямо перед тем, как принять заказ, на выполнение которого уходит секунда. Они будут работать, пока не будет назначено Событие, а точнее, их рабочее время не истечет.

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

Выполнение этого кода приводит к:

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

Заключение

В этом руководстве мы рассмотрели несколько способов задержки выполнения кода в Python, каждый из которых применим к разному контексту и требованиям.

time.sleep() очень полезен для большинства приложений, хотя он не совсем оптимален для длительного времени ожидания, обычно не используется для простого планирования и блокирует.

Используя asyncio , у нас есть асинхронная версия time.sleep() которую мы можем await .

Класс Timer задерживает выполнение кода и при необходимости может быть отменен.

Класс Event генерирует события, которые несколько потоков могут прослушивать и соответственно реагировать, задерживая выполнение кода до тех пор, пока не будет установлено определенное событие.

45) время сна Python ()

Функция сна () Python будет задерживать выполнение кода на количество секунд, заданных в качестве входных данных для сна (). Команда sleep () является частью временного модуля. Вы можете использовать функцию sleep (), если хотите временно остановить выполнение вашего кода. Например, если вы ожидаете завершения процесса или загрузки файла и т. Д.

В этом уроке вы узнаете:

Синтаксис

Параметры:

секунды : количество секунд, которое вы хотите, чтобы выполнение вашего кода было остановлено.

Пример: использование функции sleep () в Python

Следуйте инструкциям ниже, чтобы добавить sleep () в ваш скрипт на python.

Шаг 1:

Шаг 2: Добавьте time.sleep ()

Число 5, заданное как input для sleep (), – это количество секунд, в течение которого вы хотите, чтобы выполнение кода было остановлено при его выполнении.

Вот рабочий код вместе с сообщениями внутри print (), чтобы показать задержку отображения сообщения на терминале при выполнении.

Вывод:

Как отложить выполнение функции с помощью sleep ()?

Пример, показанный ниже, имеет функцию, называемую display (). Функция display () выводит сообщение «Welcome to Guru99 Tutorials». Когда функция вызывается, она запускается и отображает сообщение внутри терминала.

Чтобы добавить задержку к выполнению функции, давайте добавим time.sleep () перед вызовом функции. Во время выполнения time.sleep () остановится на указанное количество секунд, а затем будет вызвана функция display ().

Пример:

Вывод:

Как можно добавить задержку в скрипте Python?

Использование функции sleep ()

Ранее мы видели несколько примеров использования time.sleep (). Давайте попробуем другой пример, используя time.sleep ().

Пример:

В коде есть цикл for, который будет принимать строковую переменную и печатать каждый символ с задержкой в ​​1 секунду.

Вывод:

Использование функции asyncio.sleep доступно из (Python 3.4 или выше)

Вы можете использовать asyncio.sleep с Python версии 3.4 и выше. Чтобы использовать метод сна asyncio, вам нужно добавить async и await в функцию, как показано в примере ниже:

В скрипте есть вызов функции display (), который выводит сообщение «Добро пожаловать в Guru99». В функции async и await используются два ключевых слова. Ключевое слово async добавляется в начале определения функции, а ожидание добавляется непосредственно перед asyncio.sleep (). Оба ключевых слова async / await предназначены для выполнения асинхронной задачи.

Когда вызывается функция display (), и она встречает await asyncio.sleep (5), код остановится или остановится в этой точке на 5 секунд и, как только будет выполнено, напечатает сообщение.

Использование Event (). Wait

Метод Event (). Wait происходит из модуля потоков. Метод Event.wait () остановит выполнение любого процесса на количество секунд, которое он принимает в качестве аргумента. Работа Event показана в примере ниже:

Код использует Event (). Wait (5). Число 5 – это количество секунд, в течение которых код будет задерживаться для перехода к следующей строке, которая вызывает функцию display (). По истечении 5 секунд будет вызвана функция display (), и сообщение будет напечатано внутри терминала.

Вывод:

Использование таймера

Таймер – это еще один метод, доступный в Threading, который помогает получить те же функции, что и в спящем режиме. Работа таймера показана в примере ниже:

Функция time sleep() в Python

В этом уроке мы узнаем о методе time sleep() в python. Функция используется для добавления задержки в выполнении программы. Мы можем использовать функцию sleep(), чтобы остановить выполнение программы на заданное время в секундах. Обратите внимание, что функция ожидания времени фактически останавливает выполнение только текущего потока, а не всей программы.

Синтаксис

sleep() – это метод модуля времени в Python. Итак, сначала мы должны импортировать модуль времени, затем мы можем использовать этот метод. Способ использования функции sleep():

Способ использования функции sleep()

Здесь аргумент метода sleep() t находится в секундах. Это означает, что когда выполняется инструкция time.sleep(t), следующая строка кода будет выполнена через t секунд. Смотрите следующий пример:

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

Аргумент может иметь плавающее значение для более точной задержки. Например, вы хотите сделать задержку на 100 миллисекунд, что составляет 0,1 секунды, как показано ниже:

Пример

Давайте посмотрим на следующий пример функции sleep в Python.

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

Различное время задержки сна

Иногда может потребоваться задержка на разные секунды. Сделать это можно следующим образом:

Эффектная печать с использованием sleep()

Возможно, вам придется напечатать какое-нибудь сообщение необычным образом, вы можете сделать это так:

Если вы запустите приведенный выше код, вы увидите, что после печати каждого символа сообщения требуется некоторое время, что кажется эффектным.

Метод при многопоточности

Функция time sleep() – очень важный метод для многопоточности. Ниже приведен простой пример, показывающий, что функция ожидания времени останавливает выполнение текущего потока только при многопоточном программировании.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *