- How to Sleep a Thread in Python
- Need to Sleep in a Thread
- What is Sleep
- Why Use Sleep
- Sleep to Introduce a Delay
- Sleep to Slow-Down a Loop
- Sleep to Let Other Threads Run
- Python sleep(): Как выполнить код с задержкой?
- Вызов sleep() через time.sleep()
- Вызов sleep() с декораторами
- Вызов sleep() в потоках
- Использование time.sleep() в threading
How to Sleep a Thread in Python
You can sleep a thread by calling the time.sleep() function.
In this tutorial you will discover how to sleep a thread in Python.
Need to Sleep in a Thread
A thread is a thread of execution in a computer program.
Every Python program has at least one thread of execution called the main thread. Both processes and threads are created and managed by the underlying operating system.
Sometimes we may need to create additional threads in our program in order to execute code concurrently.
Python provides the ability to create and manage new threads via the threading module and the threading.Thread class.
You can learn more about Python threads in the guide:
In concurrent programming we may want the current thread to block or sleep for a specified time.
How can we make threads sleep in Python?
Run your loops using all CPUs, download my FREE book to learn how.
What is Sleep
The time.sleep() function will cause the calling thread to block for the specified number of seconds.
Suspend execution of the calling thread for the given number of seconds.
— time — Time access and conversions
The time.sleep() function takes a floating point number of seconds to sleep.
If a fraction less than zero is provided, then this indicates the number of milliseconds for the calling thread to block.
The argument may be a floating point number to indicate a more precise sleep time.
— time — Time access and conversions
Recall that there are 1,000 milliseconds in one second. Therefore a sleep value of 0.1 will allow the calling thread to sleep for 1/10th of a second or 100 milliseconds.
We may call the time.sleep() function from the main thread, which is the default thread in your progress. We may also call the time.sleep() function from a new thread used to execute a custom function.
The calling thread may block for less than the time specified, if the process is interrupted.
The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine.
— time — Time access and conversions
This may happen if the user presses Ctrl-C to send a SIGINT (signal interrupt) to the process that owns the thread, which by default will terminate the process.
The calling thread will block for at least the specified number of seconds, but may block for longer.
… the suspension time may be longer than requested by an arbitrary amount because of the scheduling of other activity in the system.
— time — Time access and conversions
This is because the underlying operating system decides what threads should run and when to run them. It may decide to let the thread block for a little longer before waking it up and allowing it to resume execution (e.g. a fraction of a second longer).
The time.sleep() function calls a system function to block the calling thread. e.g. the sleep system call. This function call itself may have more or less precision than you require. For example, although you specify a sleep of one or a few milliseconds, the underlying system call may have a precision limited at tens of milliseconds.
This is a capability provided by the underlying operating system and may be implemented differently on different operating systems, such as Windows, Linux and MacOS.
Next, let’s consider why we might sleep a thread.
Confused by the threading module API?
Download my FREE PDF cheat sheet
Why Use Sleep
There are many reasons why we may want a thread to sleep.
- Add a delay.
- Slow down execution of a loop.
- Allow other threads to run.
- Force race conditions during debugging.
Let’s take a closer look at each in turn.
Sleep to Introduce a Delay
We may want to introduce a delay into our program.
This may be to avoid overwhelming an external resource, such as:
- Making too many connections to a web server
- creating too many files too quickly.
- Sending many emails too fast.
For example, too many rapid sequential operations on an external resource may trigger computer security measures to protect the resource from a denial of service attack.
It may be to simply slow down a process to permit the user or another thread to take notice and respond to changes within the application.
Sleep to Slow-Down a Loop
We may introduce a sleep to slow down the execution of a loop.
This may be to make the program more usable, such as to allow the user to see and read messages printed each iteration.
It may also be to avoid overwhelming an external resource that is used each iteration of the loop.
Sleep to Let Other Threads Run
Calling sleep will block the current thread.
This will signal to the underlying operating system that the thread is a candidate for a context switch.
You may recall that modern operating systems like Windows, MacOS and Linux achieve multitasking via context switching threads. This is where running threads are suspended and suspended threads are resumed. This process of context switching between threads is occurring continuously by the operating system to simulate the running of multiple programs and program threads concurrently.
Calling sleep is one way to allow other threads in the Python application or other threads on the system to run.
This may be achieved with a call to time.sleep() with zero seconds, for example:
Python sleep(): Как выполнить код с задержкой?
Знакома ли вам ситуация, когда программа Python должна выполняться не сразу? В большинстве случаев требуется, чтобы код запускался как можно скорее. Однако порой перед работой оптимальнее будет дать программе немного поспать.
В Python есть возможность вызвать функцию sleep() для симуляции задержки в выполнении программы. Быть может, вам нужно дождаться загрузки, скачивания или появления графического объекта на экране. Также может потребоваться сделать паузу между вызовами к веб API или запросами к базе данных. В таких случаях поможет добавление вызова функции sleep() в программу.
Главные аспекты данного руководства по вызову sleep() в Python:
Данная статья предназначена для разработчиков Python среднего уровня, что стремятся повысить свою квалификацию. Если это похоже на вас, приступим!
Вызов sleep() через time.sleep()
В Python есть встроенная поддержка для погружения программы в сон. У модуля time есть функция sleep(), что позволяет отсрочить выполнение вызываемого потока на указанное количество секунд.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Далее дан пример использования time.sleep() :
При запуске кода из консоли, задержку нужно проводить перед вводом нового оператора в REPL.
На заметку: В Python 3.5 разработчики слегка изменили поведение time.sleep() . Благодаря новой системе вызова sleep() эффект отсрочки будет длиться как минимум на продолжении указанного количества секунд, даже в том случае, если сон прерывается сигналом. Однако, это не касается случаев, если сигнал является признаком вызова исключения.
Вы можете протестировать, как долго продлиться сон с помощью модуля Python timeit:
Здесь модуль timeit запускается с параметром -n , что указывает timeit , сколько раз выполнять последующий оператор. Можно заметить, что timeit выполнил оператор 3 раза, а лучшее время длилось 3 секунды, чего и следовало ожидать.
По умолчанию timeit будет запускать код миллион раз. Если бы вы запустили вышеуказанный код, оставив значение -n по умолчанию, тогда при 3 секундах на итерацию код завис бы примерно на 34 дня! У модуля timeit есть несколько других настроек для командной строки, с которыми можно ознакомиться в документации.
Создадим что-то более практичное. Системному администратору всегда нужно быть в курсе, если какой-то из сайтов упал. Вы бы хотели иметь возможность проверить код состояния сайта регулярно, но запрашивать веб сервер постоянно нельзя, ведь это сильно повлияет на производительность. В Python одним из простых способов совершить такую проверку является использование системного вызова sleep() :
Здесь создается uptime_bot() , что принимает URL в качестве аргумента. Затем функция пытается открыть данный URL c urllib . При возникновении HTTPError или URLError программа перехватывает ошибку и выводит на экран. На практике вам, скорее всего, придется зафиксировать ошибку и отправить письмо веб-мастеру или системному администратору.
Если ошибок нет, код спокойно выполняется. Вне зависимости от того, что произойдет, программа уходит в сон на 60 секунд. Это значит, что доступ к сайту будет раз за минуту. URL, используемый в примере, содержит ошибки. Ежеминутный вывод на консоли выглядит следующим образом:
Попробуйте обновить код, используя проверенный хороший URL, к примеру https://www.google.com/. После этого вы можете перезапустить программу и проверить, что изменилось. Также можно попробовать обновить код для отправки сообщения или записи об ошибке. Для получения более подробной информации можете ознакомиться со статьями отправка писем smtp и логирование.
Вызов sleep() с декораторами
В некоторых случаях нужно повторно запустить неудачно выполненную в первый раз функцию. Зачастую это происходит, когда требуется повторить загрузку файла ввиду ранней перегрузки сервера. Как правило, никто не хочет делать частые запросы на серверы, поэтому добавление в Python вызова sleep() между каждым запросом предпочтительно.
Другим возможным случаем использования sleep() является необходимость проверки состояния пользовательского интерфейса во время автоматического теста. В зависимости от компьютера, на котором запускается тест, пользовательский интерфейс может грузиться быстрее или медленнее обычного. Это может изменить отображаемое на экране во время проверки программой чего-то.
В данном случае можно указать программе, чтобы та погрузилась в сон на мгновенье и затем проверить все опять через несколько секунд. Это может означать разницу между прохождением или провалом теста.
Для добавления системного вызова sleep() в Python можно использовать декоратор в каждом из данных случаев. Разберем следующий пример:
sleep() является вашим декоратором. Он принимает значение timeout и количество раз для повтора retry , что по умолчанию равняется 3. Внутри sleep() есть другая функция, the_real_decorator() , которая принимает декорируемую функцию.
В конечном итоге самая внутренняя функция wrapper() принимает аргументы и ключевые слова, которые вы передаете декорируемой функции. Здесь все и происходит! Используется цикл while, чтобы повторить вызов функции. Если возникла ошибка, вызывается time.sleep() , увеличивается счетчик попыток retries и повторяется попытка запуска функции.
Теперь переписывается uptime_bot() для использования нового декоратора:
Здесь вы декорируете uptime_bot() с помощью sleep() в 3 секунды. Вы также удалили оригинальный цикл while и старый вызов sleep(60) . Декоратор теперь позаботится об этом.
Другое изменение состоит в добавлении raise внутри блоков, отвечающих за обработку исключений. Это нужно для правильной работы декоратора. Можно также написать декоратор, чтобы он отвечал за ошибки, однако ввиду того, что исключения касаются только urllib , может быть лучше сохранить декоратор в текущем состоянии. В таком случае он будет работать c более широким ассортиментом функций.
На заметку: При желании более подробно узнать о том, как справляться с исключениями в Python, можете ознакомиться со статьей: Обработка исключений в Python
Декоратору можно добавить несколько улучшений. Если число попыток заканчивается, и он по-прежнему проваливается, тогда можно сделать так, чтобы он повторно вызвал последнюю ошибку. Декоратор подождет 3 секунды после последней неудачи, что не всегда нужно. Можете попробовать поэкспериментировать самостоятельно.
Вызов sleep() в потоках
Могут возникнуть ситуации, когда в Python требуется добавить вызов sleep() для потока. К примеру, запуск скрипта миграции для базы данных с миллионами записей. Здесь важно избежать простоя, а также не ждать дольше необходимого для завершения миграции, поэтому можно использовать потоки.
На заметку: Потоки являются одним из методов использования конкурентности в Python. Можно запустить несколько потоков одновременно, чтобы увеличить производительность приложения. Если потоки в Python являются для вас новой темой, ознакомьтесь со статьей модуль threading.
Чтобы клиенты не замечали какого-либо замедления, каждый поток должен работать в течение короткого периода времени, а затем уходить в сон. Есть два способа сделать это:
Начнем с разбора time.sleep() .
Использование time.sleep() в threading
Python Logging Cookbook является хорошим примером использования time.sleep() . Модуль логирования logging является потоко-безопасным, поэтому в данном примере он будет полезнее, чем операторы print() . В основе следующего кода лежит данный пример: