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

Как замедлить цикл в python

  • автор:

Метод time.sleep() в Python

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

import time time.sleep(5) #задержка в течение 5 секунд

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

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

import time time.sleep(1.500)

Когда вы запускаете приведенный выше Пример:, программа ждет завершения 1 секунды и 500 миллисекунд.

time.sleep (1) # sleep в течение 1 секунды time.sleep (60) # сон в течение 1 минуты time.sleep (3600) # сон в течение 1 часа

Задержка времени для бесконечного цикла

Вот еще один пример когда что-то выполняется примерно каждые 5 секунд.

import time while True: print("Thi smessage prints each 5 seconds") time.sleep(5) # Задержка в течение 5 секунд

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

Сон программы

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

import time wait = 10 while wait > 0: print(wait) time.sleep(1) wait = wait - 1

Thread и Sleep

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

import time from threading import Thread class Main_Thread(Thread): def run(self): for x in range(100, 104): print(x, " - Main Thread") time.sleep(5) class Service_Thread(Thread): def run(self): for x in range(1, 16): print(x) time.sleep(1) Main_Thread().start() Service_Thread().start()
100 - Main Thread 1 2 3 4 5 101 - Main Thread 6 7 8 9 10 102 - Main Thread 11 12 13 14 15 103 - Main Thread

Точность time.sleep()

Time.sleep (секунды) не в реальном времени. Функция time.sleep() использует функцию sleep() базовой операционной системы, иногда она может быть отключена с точки зрения миллисекунд. Большинство ПК-машин имеют аппаратные ограничения в диапазоне 1-10 мс, независимо от операционной системы. В операционной системе time.sleep() просто означает подсказку. Это не хороший механизм синхронизации, но достаточно хорош для большинства приложений. Как правило, однако, если вы не хотите спать в течение очень небольшого периода времени, вы можете вообще игнорировать эту информацию.

import time sleep_start = time.time() for cnt in range(0,10): print(cnt) time.sleep(1) # 1 sec delay sleep_end = time.time() diff = sleep_end - sleep_start print("Looping time :",diff)
Looping time : 10.040287017822266

Как замедлить часть проекта python?

leahch

Смотрите, я создаю 2d игру и нужно сделать так, что бы я мог задержать одно действие, но остальная часть проекта работала
На примере:
for i in range(5):
a += 1
x. append(a)
print(x)
time. sleep(1)
(Предыдущий код относиться к циклу)

print(b + 1)
(это к нему не относиться)

Но нужно чтобы к b прибавилась единица и вывелост через определённоё время, но не после цикла. То есть цикл выполняется, после каждого завершения выводиться значение списка x и нужно, что бы где то когда цикл будет на втором круге вывелась b+1

Максим @MaximPython

time.sleep(Вписываете сколько секунд подождать)

Ответ написан более трёх лет назад
GrimGloom @GrimGloom Автор вопроса
time. sleep() останавливает весь проект

ayazer

GrimGloom, только текущий поток

trapwalker

Сергей П @trapwalker Куратор тега Python
Программист, энтузиаст

Не стесняйтесь заглядывать в исходники. В модуле threading, например, есть отдельный класс (наследник от Thread) для отложенного запуска функций. Вот его код полностью:

class Timer(Thread): """Call a function after a specified number of seconds: t = Timer(30.0, f, args=None, kwargs=None) t.start() t.cancel() # stop the timer's action if it's still waiting """ def __init__(self, interval, function, args=None, kwargs=None): Thread.__init__(self) self.interval = interval self.function = function self.args = args if args is not None else [] self.kwargs = kwargs if kwargs is not None else <> self.finished = Event() def cancel(self): """Stop the timer if it hasn't finished yet.""" self.finished.set() def run(self): self.finished.wait(self.interval) if not self.finished.is_set(): self.function(*self.args, **self.kwargs) self.finished.set()

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

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

Замедление скрипта

Добрый день. Решил немного освоить питон. Накидал небольшой скрипт который вытаскивает табличку из Excel файла. В файле строчек примерно до 3000.
чем дальше по файлу ползет скрипт, тем медленнее он выполняется. Такое ощущение, что он с каждым проходом от начала забора бегает. Читал, что такое можно поймать при использовании неизменяемых типов, пока не могу сообразить.
Можете ткнуть мордой?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
from tkinter import filedialog from tkinter import * from typing import NamedTuple import openpyxl import sys class Unit(NamedTuple): address: int description: str type: int size: int readonly: bool eeprom: bool def openXLSMFile(): Tk().withdraw() filename = filedialog.askopenfilename(title = "Select .xlsm file", filetypes = (("Excel files","*.xlsm *.xlsx"),("all files","*.*"))) return filename def findTableOffset(worksheet): for x in range(1, 100): for y in range (1, 100): if worksheet.cell(row = x, column = y).value == "Индекс": return x + 1, y return -1, -1 def makeUnit(worksheet, currentRow, columnOffset): address = int(worksheet.cell(row = currentRow, column = columnOffset).value) description = str(worksheet.cell(row = currentRow, column = columnOffset + 2).value) type = str(worksheet.cell(row = currentRow, column = columnOffset + 4).value) readonly = str(worksheet.cell(row = currentRow, column = columnOffset + 5).value) eeprom = str(worksheet.cell(row = currentRow, column = columnOffset + 6).value) if description == "Резерв" or description == "None": return -1 size = 1 if type == "WORD": size = 1 type = 0 elif type == "FLOAT": size = 2 type = 1 elif type[:4] == "CHAR": temp = type.rstrip("]").strip("CHAR[") if not str(temp).isdigit(): return -1 size = int(temp) / 2 type = 2 else: return -1 if readonly == "R": readonly = True elif readonly == "W" or readonly == "RW" or readonly == "R/W" or readonly == "None": readonly == False else: return -1 if eeprom == "EEPROM": eeprom = True elif eeprom == "NO" or eeprom == "None": eeprom = False else: return -1 unit = Unit(address, description, type, size, readonly, eeprom) return unit print("Use this script to convert Excel files to ModbusUtility file .mem") filename = openXLSMFile() if filename != "": print("File " + filename + " was opened Successfully") workbook = openpyxl.load_workbook(filename, read_only = True) worksheet = workbook.active rowOffset, columnOffset = findTableOffset(worksheet) if rowOffset == -1: sys.exit("File " + filename + " hasn't got modbus memory table!") currentRow = rowOffset unitsList = [] while str(worksheet.cell(row = currentRow, column = columnOffset).value).isdigit(): unit = makeUnit(worksheet, currentRow, columnOffset) if(unit != -1): unitsList.append(unit) print(str(unit.address), end = '\t\t') print(str(unit.description), end = '\t\t') print(str(unit.type), end = '\t') print(str(unit.size), end = '\t') print(str(unit.readonly), end = '\t') print(str(unit.eeprom)) currentRow += 1

Python sleep(): Как выполнить код с задержкой?

sleep в Python

Знакома ли вам ситуация, когда программа Python должна выполняться не сразу? В большинстве случаев требуется, чтобы код запускался как можно скорее. Однако порой перед работой оптимальнее будет дать программе немного поспать.

В Python есть возможность вызвать функцию sleep() для симуляции задержки в выполнении программы. Быть может, вам нужно дождаться загрузки, скачивания или появления графического объекта на экране. Также может потребоваться сделать паузу между вызовами к веб API или запросами к базе данных. В таких случаях поможет добавление вызова функции sleep() в программу.

Главные аспекты данного руководства по вызову sleep() в Python:

  • time.sleep() ;
  • Декораторы;
  • Потоки;
  • Async IO;
  • Графический пользовательский интерфейс GUI.

Данная статья предназначена для разработчиков Python среднего уровня, что стремятся повысить свою квалификацию. Если это похоже на вас, приступим!

Вызов sleep() через time.sleep()

В Python есть встроенная поддержка для погружения программы в сон. У модуля time есть функция sleep(), что позволяет отсрочить выполнение вызываемого потока на указанное количество секунд.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Далее дан пример использования time.sleep() :

import time
time . sleep ( 3 ) # Сон в 3 секунды

При запуске кода из консоли, задержку нужно проводить перед вводом нового оператора в REPL.

На заметку: В Python 3.5 разработчики слегка изменили поведение time.sleep() . Благодаря новой системе вызова sleep() эффект отсрочки будет длиться как минимум на продолжении указанного количества секунд, даже в том случае, если сон прерывается сигналом. Однако, это не касается случаев, если сигнал является признаком вызова исключения.

Вы можете протестировать, как долго продлиться сон с помощью модуля Python timeit:

$ python3 — m timeit — n 3 «import time; time.sleep(3)»
3 loops , best of 3 : 3 sec per loop

Здесь модуль timeit запускается с параметром -n , что указывает timeit , сколько раз выполнять последующий оператор. Можно заметить, что timeit выполнил оператор 3 раза, а лучшее время длилось 3 секунды, чего и следовало ожидать.

По умолчанию timeit будет запускать код миллион раз. Если бы вы запустили вышеуказанный код, оставив значение -n по умолчанию, тогда при 3 секундах на итерацию код завис бы примерно на 34 дня! У модуля timeit есть несколько других настроек для командной строки, с которыми можно ознакомиться в документации.

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

import time
import urllib . request
import urllib . error
def uptime_bot ( url ) :
while True :
conn = urllib . request . urlopen ( url )
except urllib . error . HTTPError as e :
# Отправка admin / log
print ( f ‘HTTPError: для ‘ )
except urllib . error . URLError as e :
# Отправка admin / log
print ( f ‘URLError: для ‘ )
# Сайт поднят
print ( f ‘ поднят’ )
time . sleep ( 60 )
if __name__ == ‘__main__’ :
url = ‘http://www.google.com/py’
uptime_bot ( url )

Здесь создается uptime_bot() , что принимает URL в качестве аргумента. Затем функция пытается открыть данный URL c urllib . При возникновении HTTPError или URLError программа перехватывает ошибку и выводит на экран. На практике вам, скорее всего, придется зафиксировать ошибку и отправить письмо веб-мастеру или системному администратору.

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

HTTPError : 404 для http : / / www .google .com / py

Попробуйте обновить код, используя проверенный хороший URL, к примеру https://www.google.com/. После этого вы можете перезапустить программу и проверить, что изменилось. Также можно попробовать обновить код для отправки сообщения или записи об ошибке. Для получения более подробной информации можете ознакомиться со статьями отправка писем smtp и логирование.

Вызов sleep() с декораторами

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

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

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

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

import time
import urllib . request
import urllib . error
def sleep ( timeout , retry = 3 ) :
def the_real_decorator ( function ) :
def wrapper ( * args , * * kwargs ) :
retries = 0
while retries < retry : value = function ( * args , * * kwargs ) if value is None : print ( f 'Сон на секунд’ )
time . sleep ( timeout )
retries += 1
return wrapper
return the_real_decorator

sleep() является вашим декоратором. Он принимает значение timeout и количество раз для повтора retry , что по умолчанию равняется 3. Внутри sleep() есть другая функция, the_real_decorator() , которая принимает декорируемую функцию.

В конечном итоге самая внутренняя функция wrapper() принимает аргументы и ключевые слова, которые вы передаете декорируемой функции. Здесь все и происходит! Используется цикл while, чтобы повторить вызов функции. Если возникла ошибка, вызывается time.sleep() , увеличивается счетчик попыток retries и повторяется попытка запуска функции.

Теперь переписывается uptime_bot() для использования нового декоратора:

def uptime_bot ( url ) :
conn = urllib . request . urlopen ( url )
except urllib . error . HTTPError as e :
# Отправка admin / log
print ( f ‘HTTPError: для ‘ )
# Повторное поднятие ошибки исключения для декоратора
raise urllib . error . HTTPError
except urllib . error . URLError as e :
# Отправка admin / log
print ( f ‘URLError: для ‘ )
# Повторное поднятие ошибки исключения для декоратора
raise urllib . error . URLError
# Сайт поднят
print ( f ‘ поднят’ )
if __name__ == ‘__main__’ :
url = ‘http://www.google.com/py’
uptime_bot ( url )

Здесь вы декорируете uptime_bot() с помощью sleep() в 3 секунды. Вы также удалили оригинальный цикл while и старый вызов sleep(60) . Декоратор теперь позаботится об этом.

Другое изменение состоит в добавлении raise внутри блоков, отвечающих за обработку исключений. Это нужно для правильной работы декоратора. Можно также написать декоратор, чтобы он отвечал за ошибки, однако ввиду того, что исключения касаются только urllib , может быть лучше сохранить декоратор в текущем состоянии. В таком случае он будет работать c более широким ассортиментом функций.

На заметку: При желании более подробно узнать о том, как справляться с исключениями в Python, можете ознакомиться со статьей: Обработка исключений в Python

Декоратору можно добавить несколько улучшений. Если число попыток заканчивается, и он по-прежнему проваливается, тогда можно сделать так, чтобы он повторно вызвал последнюю ошибку. Декоратор подождет 3 секунды после последней неудачи, что не всегда нужно. Можете попробовать поэкспериментировать самостоятельно.

Вызов sleep() в потоках

Могут возникнуть ситуации, когда в Python требуется добавить вызов sleep() для потока. К примеру, запуск скрипта миграции для базы данных с миллионами записей. Здесь важно избежать простоя, а также не ждать дольше необходимого для завершения миграции, поэтому можно использовать потоки.

На заметку: Потоки являются одним из методов использования конкурентности в Python. Можно запустить несколько потоков одновременно, чтобы увеличить производительность приложения. Если потоки в Python являются для вас новой темой, ознакомьтесь со статьей модуль threading.

Чтобы клиенты не замечали какого-либо замедления, каждый поток должен работать в течение короткого периода времени, а затем уходить в сон. Есть два способа сделать это:

  1. Использовать time.sleep() как ранее;
  2. Использовать Event.wait() из модуля threading ;

Начнем с разбора time.sleep() .

Использование time.sleep() в threading

Python Logging Cookbook является хорошим примером использования time.sleep() . Модуль логирования logging является потоко-безопасным, поэтому в данном примере он будет полезнее, чем операторы print() . В основе следующего кода лежит данный пример:

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

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