Python time sleep()
Содержание:
- Таймер процессора
- Sleep cycle
- Текущее время в Python
- Использование time.sleep() в threading
- Счетчик производительности
- Что такое класс Process в Python?
- Время выполнения программы
- datetime.datetime
- Вызов sleep() через time.sleep()
- Вызов sleep() с декораторами
- How to Improve Sleep Quality and Duration
- Очередь и блокировки
- Ограничение одновременного доступа к ресурсам
- Пользовательские Классы таймера Python
Таймер процессора
В то время как time() возвращает время основных часов, clock() возвращает время процессора. Для этого можно использовать Python get time.
Значения, возвращаемые функцией clock(), отражают фактическое время, используемое программой при ее запуске:
time_clock.py import hashlib import time # Данные, используемые для вычисления контрольной суммы md5 data = open(__file__, 'rb').read() for i in range(5): h = hashlib.sha1() print(time.ctime(), ': {:0.3f} {:0.3f}'.format( time.time(), time.clock())) for i in range(300000): h.update(data) cksum = h.digest()
В этом примере отформатированная ctime() выводится вместе со значениями с плавающей запятой из time() и clock() через цикл для каждой итерации.
Примечание
Если хотите запустить этот код в своей системе, то может потребоваться добавить во внутренний цикл другие циклы или придется работать с большим количеством данных, чтобы увидеть разницу во времени с помощью Python time:
$ python3 time_clock.py Sun Aug 14 14:10:32 2016 : 1471198232.327 0.033 Sun Aug 14 14:10:32 2016 : 1471198232.705 0.409 Sun Aug 14 14:10:33 2016 : 1471198233.086 0.787 Sun Aug 14 14:10:33 2016 : 1471198233.466 1.166 Sun Aug 14 14:10:33 2016 : 1471198233.842 1.540
Как правило, часы процессора ничего не засекают, если программа ничего не делает:
time_clock_sleep.py import time template = '{} - {:0.2f} - {:0.2f}' print(template.format( time.ctime(), time.time(), time.clock()) ) for i in range(3, 0, -1): print('Sleeping', i) time.sleep(i) print(template.format( time.ctime(), time.time(), time.clock()) )
В этом примере time sleep python цикл выполняет мало действий, переходя в спящий режим после каждой итерации. Значение time() увеличивается даже тогда, когда приложение находится в спящем режиме, но значение clock() отсутствует:
$ python3 -u time_clock_sleep.py Sun Aug 14 14:10:34 2016 - 1471198234.28 - 0.03 Sleeping 3 Sun Aug 14 14:10:37 2016 - 1471198237.28 - 0.03 Sleeping 2 Sun Aug 14 14:10:39 2016 - 1471198239.29 - 0.03 Sleeping 1 Sun Aug 14 14:10:40 2016 - 1471198240.29 - 0.03
Вызов sleep() передает управление из текущего потока и указывает ожидать, пока система активирует его. Если программа имеет только один поток, это эффективно блокирует приложение, и оно не работает.
Sleep cycle
The sleep cycle is a natural internal system in humans. It is a combination of external conditions, such as light, personal behaviors, and lifestyle choices, and internal conditions, such as brain wave patterns and genetics.
A normal sleep cycle occurs in two distinct states: rapid eye movement (REM) sleep and nonrapid eye movement (NREM) sleep. The body moves between these states a few times a night.
The body cycles through these stages roughly every 90 minutes. Over more cycles, the NREM stages get lighter, and the REM stages get longer.
Ideally, the body will pass through four to five of these cycles each night. Waking up at the end of the cycle, when sleep is lightest, may be best to help the person wake feeling more rested and ready to start the day.
An alarm going off when a person is in one of the deeper stages of sleep may lead to grogginess or difficulty waking up.
Again, these stages vary from person to person, meaning that no single timing for sleep is right for everyone. Paying attention to how they feel in the morning and noting how many hours of sleep they got may help a person identify their sleep cycle and determine how much sleep they need.
Текущее время в Python
Работа методов из модуля time основывается на общепринятой системе описания времени, которая справедлива для Unix, а также для POSIX-совместимых ОС. Согласно ее концепции, текущее время представляется в виде обыкновенного вещественного значения в секундах, прошедших с момента начала эпохи и до сегодняшнего дня. Отправной точкой для времени считается 1 января 1970 года, когда счетчик секунд имел полностью нулевое значение.
С тех пор это число постоянно растет, позволяя людям работать с различными видами дат в максимально точном представлении. В случае необходимости секунды переводятся в часы, дни, месяцы и годы, предоставляя пользователю удобный вид отображения времени. Чтобы увидеть количество секунд, прошедших с момента начала эпохи, достаточно вызвать метод time(). Но перед этим необходимо подключить модуль time с помощью операции импорта.
import time print(time.time()) 1540289822.637441
Как можно увидеть из данного примера, функция print получает в качестве единственного параметра число, возвращенное из метода time(), после чего выводит его на экран. Таким образом, с 1 января 1970 года прошло уже более полтора миллиарда секунд. Но подобное представление времени совсем неудобно для пользователя программы. Чтобы отобразить текущую дату в более комфортном виде, стоит передать функции print результат работы метода ctime(), не забыв произвести импорт соответствующей ему библиотеки time.
import time print(time.ctime()) Tue Oct 23 10:18:23 2018
В результате выполнения вышеописанной программы на экране будут отображены точные сведения о текущем времени, которые включают в себя день недели, название месяца, его число, часы, минуты, секунды и год. Кроме того, в качестве параметра методу ctime() можно передать любое значение в секундах, полученное при помощи упомянутого ранее time().
Методы
Для работы с временем в стандартной библиотеке языка Python имеется множество самых разных методов. Наиболее популярные функции, реализованные в модуле time, описаны в следующей таблице. Здесь можно найти их название, а также краткую характеристику.
Метод | Характеристика |
time() | возвращает текущее время, прошедшее с начала 1970 года в секундах |
ctime(s) | возвращает местное время в строке или время, полученное из s секунд |
clock() | возвращает процессорное время, прошедшее с момента первого вызова этой функции, точность больше 1 микросекунды |
sleep(s) | останавливает ход выполнения программы ровно на s секунд |
strftime(s) | преобразует переданное в качестве аргумента время s в строку по формату |
strptime(s) | разбирает строку s и преобразует в объект времени по формату |
mktime(s) | преобразует время s в количество секунд с начала 1970 года |
localtime(s) | возвращает объект, представляющий местное время или время s |
Использование time.sleep() в threading
Python является хорошим примером использования . Модуль логирования logging является потоко-безопасным, поэтому в данном примере он будет полезнее, чем операторы . В основе следующего кода лежит данный пример:
Python
import logging
import threading
import time
def worker(arg):
while not arg:
logging.debug(«рабочий поток вносится»)
time.sleep(1)
def main():
logging.basicConfig(
level=logging.DEBUG,
format=»%(relativeCreated)6d %(threadName)s %(message)s»
)
info = {«stop»: False}
thread = threading.Thread(target=worker, args=(info,))
thread_two = threading.Thread(target=worker, args=(info,))
thread.start()
thread_two.start()
while True:
try:
logging.debug(«Добавление из главного потока»)
time.sleep(0.75)
except KeyboardInterrupt:
info = True
logging.debug(‘Остановка’)
break
thread.join()
thread_two.join()
if __name__ == «__main__»:
main()
1 9 25 |
importlogging importthreading importtime defworker(arg) whilenotarg»stop» logging.debug(«рабочий поток вносится»)
defmain() logging.basicConfig( level=logging.DEBUG, format=»%(relativeCreated)6d %(threadName)s %(message)s» ) info={«stop»False} thread=threading.Thread(target=worker,args=(info,)) thread_two=threading.Thread(target=worker,args=(info,)) thread.start() thread_two.start() whileTrue try logging.debug(«Добавление из главного потока») exceptKeyboardInterrupt info»stop»=True logging.debug(‘Остановка’) break thread.join() thread_two.join() if__name__==»__main__» main() |
Здесь для создания двух потоков используется модуль Python . Также создается объект входа, что будет вводить в . Затем начинаются оба потока и инициируется цикл для каждого входа из главного потока. Для фиксирования пользователя используется при нажатии .
Попробуйте запустить вышеуказанный код в терминале. Ваш вывод должен походить на следующий:
Shell
2 Thread-1 рабочий поток вносится
4 Thread-2 рабочий поток вносится
4 MainThread Добавление из главного потока
755 MainThread Добавление из главного потока
1004 Thread-1 рабочий поток вносится
1006 Thread-2 рабочий поток вносится
1506 MainThread Добавление из главного потока
2005 Thread-1 рабочий поток вносится
2007 Thread-2 рабочий поток вносится
2257 MainThread Добавление из главного потока
3007 Thread-1 рабочий поток вносится
3008 MainThread Добавление из главного потока
1 2 3 4 5 6 7 8 9 10 11 12 |
2Thread-1рабочийпотоквносится 4Thread-2рабочийпотоквносится 4MainThreadДобавлениеизглавногопотока 755MainThreadДобавлениеизглавногопотока 1004Thread-1рабочийпотоквносится 1006Thread-2рабочийпотоквносится 1506MainThreadДобавлениеизглавногопотока 2005Thread-1рабочийпотоквносится 2007Thread-2рабочийпотоквносится 2257MainThreadДобавлениеизглавногопотока 3007Thread-1рабочийпотоквносится 3008MainThreadДобавлениеизглавногопотока |
Когда каждый поток работает, а затем уходит в сон, выходные данные выводятся в консоль. Теперь, разобрав пример, вы сможете использовать данные концепции в своем собственном коде.
Счетчик производительности
Для измерения производительности важно иметь таймеры monotonic с высокой точностью. Определение наилучшего источника данных синхронизации требует наличия информации о платформе, которую Python предоставляет в perf_counter():
time_perf_counter.py import hashlib import time # Data to use to calculate md5 checksums data = open(__file__, 'rb').read() loop_start = time.perf_counter() for i in range(5): iter_start = time.perf_counter() h = hashlib.sha1() for i in range(300000): h.update(data) cksum = h.digest() now = time.perf_counter() loop_elapsed = now - loop_start iter_elapsed = now - iter_start print(time.ctime(), ': {:0.3f} {:0.3f}'.format( iter_elapsed, loop_elapsed))
Как и в случае с функцией Python time monotonic(), эпоха для perf_counter() не определяется. Значения предназначены для сравнения и вычисления, а не в качестве абсолютных значений:
$ python3 time_perf_counter.py Sun Aug 14 14:10:40 2016 : 0.487 0.487 Sun Aug 14 14:10:41 2016 : 0.485 0.973 Sun Aug 14 14:10:41 2016 : 0.494 1.466 Sun Aug 14 14:10:42 2016 : 0.487 1.953 Sun Aug 14 14:10:42 2016 : 0.480 2.434
Что такое класс Process в Python?
Класс Process в Python – это абстракция, которая настраивает другой процесс Python, предоставляет его для выполнения кода.
К классу Process принадлежат две важные функции – start() и join().
Сначала нам нужно написать функцию, которая будет запускаться процессом. Затем нам нужно создать экземпляр объекта процесса.
Если мы создадим объект процесса, ничего не произойдет, пока мы не скажем ему начать обработку с помощью функции start(). Затем процесс запустится и вернет свой результат. После этого мы говорим процессу завершиться через функцию join().
Без вызова функции join() процесс останется бездействующим и не завершится.
Поэтому, если вы создадите много процессов и не завершите их, вы можете столкнуться с нехваткой ресурсов. Тогда вам может потребоваться удалить их вручную.
Одна важная вещь: если вы хотите передать какой-либо аргумент через процесс, вам нужно использовать аргумент ключевого слова args. Следующий код будет полезен для понимания использования класса Process.
from multiprocessing import Process def print_func(continent='Asia'): print('The name of continent is : ', continent) if __name__ == "__main__": # confirms that the code is under main function names = procs = [] proc = Process(target=print_func) # instantiating without any argument procs.append(proc) proc.start() # instantiating process with arguments for name in names: # print(name) proc = Process(target=print_func, args=(name,)) procs.append(proc) proc.start() # complete the processes for proc in procs: proc.join()
Время выполнения программы
Существует множество разных задач, для решения которых нужно найти время, потраченное на работу программы либо отдельных ее блоков. Чтобы найти данную величину, достаточно посчитать разницу в секундах между точкой старта определенной функции и местом, где она завершает свою работу. В следующем примере демонстрируется применение методов time() для получения текущего времени, чтобы в конечном итоге выявить, как долго работал блок кода. Метод sleep() здесь увеличивает время выполнения программы на 5 секунд.
import time start = time.time() time.sleep(5) finish = time.time() result = finish - start print("Program time: " + str(result) + " seconds.") Program time: 5.005090236663818 seconds.
Несмотря на простоту вышеописанного подхода, использовать его в серьезных целях, где требуется точный и независимый от ОС результат, не рекомендуется. Все дело в том, что числовое значение времени, получаемое таким образом, может иметь погрешности за счет внутренних особенностей работы компьютера, в среде которого выполняется программа. Например, системные часы могут быть подкорректированы вручную пользователем во время выполнения программы. Корректировка может произойти и автоматически, если настроена синхронизация системных часов по NTP.
Таким образом, может случиться такая ситуация, что функция вернет значение меньшее, чем при предыдущем вызове.
monotonic
По этой причине лучше всего использовать метод monotonic(), впервые появившийся в версии Python 3.3 на некоторых платформах, а начиная с выпуска 3.5 ставший доступным абсолютно везде. Его главной особенностью является точное представление измеряемого количества времени, вне зависимости от работы ОС и текущей платформы. Используемый таймер никогда не вернет при повторном вызове метода значение, которое будет меньше предыдущего. Это позволяет избежать многих ошибок, а также неожиданного поведения.
import time start = time.monotonic() time.sleep(15) result = time.monotonic() - start print("Program time: {:>.3f}".format(result) + " seconds.") Program time: 15.012 seconds.
В примере программы, описанном выше, продемонстрирована работа функции monotonic(). Принцип ее применения такой же, как и в предыдущем примере, однако здесь результат обладает гарантированной точностью и независим от внешних условий. Для отображения времени в более комфортной форме используется небольшое форматирование результата.
datetime.datetime
Объект datetime.datetime содержит всю информацию объектов datetime.date плюс datetime.time. Давайте приведем несколько примеров, для лучшего понимания разницы между этим объектом, и объектом datetime.date.
Python
import datetime
a = datetime.datetime(2017, 3, 5)
print(a) # datetime.datetime(2017, 3, 5, 0, 0)
b = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(b) # datetime.datetime(2017, 3, 5, 12, 30, 10)
d = datetime.datetime(2017, 3, 5, 12, 30, 10)
print(d.year) # 2017
print(d.second) # 10
print(d.hour) # 12
1 2 3 4 5 6 7 8 9 10 11 12 |
importdatetime a=datetime.datetime(2017,3,5) print(a)# datetime.datetime(2017, 3, 5, 0, 0) b=datetime.datetime(2017,3,5,12,30,10) print(b)# datetime.datetime(2017, 3, 5, 12, 30, 10) d=datetime.datetime(2017,3,5,12,30,10) print(d.year)# 2017 print(d.second)# 10 print(d.hour)# 12 |
Мы видим, что datetime.datetime принимает несколько дополнительных аргументов: год, месяц, день, час, минута и секунда. Это также позволяет вам указывать информацию о микросекундах и часовом поясе. При работе с базами данных, данные типы объектов будут использоваться достаточно часто. Большую часть вашей работы, вам нужно будет конвертировать форматы date или datetime Python в форматы SQL datetime или timestamp
Обратите внимание на то, что today совместно с datetime.datetime использует два разных метода:
Python
import datetime
a = datetime.datetime.today()
print(a) # datetime.datetime(2017, 4, 5, 0, 16, 54, 989663)
b = datetime.datetime.now()
print(b) # datetime.datetime(2017, 4, 5, 0, 17, 8, 24239)
1 2 3 4 5 6 7 |
importdatetime a=datetime.datetime.today() print(a)# datetime.datetime(2017, 4, 5, 0, 16, 54, 989663) b=datetime.datetime.now() print(b)# datetime.datetime(2017, 4, 5, 0, 17, 8, 24239) |
Модуль datetime содержит другой метод, под названием strftime. Этот метод позволяет разработчику создавать строку, отображающую время в более понятной для человека форме. Существует целая таблица параметров форматирования, с которой рекомендуется ознакомиться в документации Python, в . Давайте взглянем на несколько примеров, показывающих всю полезность данного метода:
Python
import datetime
a = datetime.datetime.today().strftime(«%Y%m%d»)
print(a) # ‘20170405’
today = datetime.datetime.today()
print( today.strftime(«%m/%d/%Y») ) # ’04/05/2017′
print( today.strftime(«%Y-%m-%d-%H.%M.%S») ) # 2017-04-05-00.18.00
1 2 3 4 5 6 7 8 9 |
importdatetime a=datetime.datetime.today().strftime(«%Y%m%d») print(a)# ‘20170405’ today=datetime.datetime.today() print(today.strftime(«%m/%d/%Y»))# ’04/05/2017′ print(today.strftime(«%Y-%m-%d-%H.%M.%S»))# 2017-04-05-00.18.00 |
Первый пример – это скорее хитрость. В нем показано, как конвертировать сегодняшний объект datetime в строку, следующую за форматом YYYYMMDD (ГГГГММДД). Второй пример более наглядный.
В нем мы присваиваем объект datetime переменной под названием today и применяем два разных параметра форматирования строки. Первый параметр добавляет косые черточки между элементами datetime, а также перегруппировывает datetime, теперь он делится на месяц, день и год. В последнем примере мы создаем временную отметку, которая следует типичному формату: YYYY-MM-DD.HH.MM.SS. Если вам нужно указать год как двухзначный (“YY”), вы можете заменить %Y на %y.
Вызов sleep() через time.sleep()
В Python есть встроенная поддержка для погружения программы в сон. У модуля есть функция , что позволяет отсрочить выполнение вызываемого потока на указанное количество секунд.
Мы собрали ТОП Книг для Python программиста которые помогут быстро изучить язык программирования Python.
Список книг: Книги по Python
Далее дан пример использования :
Python
import time
time.sleep(3) # Сон в 3 секунды
1 2 |
importtime time.sleep(3)# Сон в 3 секунды |
При запуске кода из консоли, задержку нужно проводить перед вводом нового оператора в REPL.
Вы можете протестировать, как долго продлиться сон с помощью модуля Python timeit:
Shell
$ python3 -m timeit -n 3 «import time; time.sleep(3)»
3 loops, best of 3: 3 sec per loop
1 2 |
$python3-mtimeit-n3″import time; time.sleep(3)» 3loops,best of33sec per loop |
Здесь модуль запускается с параметром , что указывает , сколько раз выполнять последующий оператор. Можно заметить, что выполнил оператор 3 раза, а лучшее время длилось 3 секунды, чего и следовало ожидать.
По умолчанию будет запускать код миллион раз. Если бы вы запустили вышеуказанный код, оставив значение по умолчанию, тогда при 3 секундах на итерацию код завис бы примерно на 34 дня! У модуля есть несколько других настроек для командной строки, с которыми можно ознакомиться в .
Создадим что-то более практичное. Системному администратору всегда нужно быть в курсе, если какой-то из сайтов упал. Вы бы хотели иметь возможность проверить код состояния сайта регулярно, но запрашивать веб сервер постоянно нельзя, ведь это сильно повлияет на производительность. В Python одним из простых способов совершить такую проверку является использование системного вызова :
Python
import time
import urllib.request
import urllib.error
def uptime_bot(url):
while True:
try:
conn = urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
# Отправка admin / log
print(f’HTTPError: {e.code} для {url}’)
except urllib.error.URLError as e:
# Отправка admin / log
print(f’URLError: {e.code} для {url}’)
else:
# Сайт поднят
print(f'{url} поднят’)
time.sleep(60)
if __name__ == ‘__main__’:
url = ‘http://www.google.com/py’
uptime_bot(url)
1 19 |
importtime importurllib.request importurllib.error defuptime_bot(url) whileTrue try conn=urllib.request.urlopen(url) excepturllib.error.HTTPError ase # Отправка admin / log print(f’HTTPError: {e.code} для {url}’) excepturllib.error.URLError ase # Отправка admin / log print(f’URLError: {e.code} для {url}’) else # Сайт поднят print(f'{url} поднят’) if__name__==’__main__’ url=’http://www.google.com/py’ uptime_bot(url) |
Здесь создается , что принимает URL в качестве аргумента. Затем функция пытается открыть данный URL c . При возникновении или программа перехватывает ошибку и выводит на экран. На практике вам, скорее всего, придется зафиксировать ошибку и отправить письмо веб-мастеру или системному администратору.
Если ошибок нет, код спокойно выполняется. Вне зависимости от того, что произойдет, программа уходит в сон на 60 секунд. Это значит, что доступ к сайту будет раз за минуту. URL, используемый в примере, содержит ошибки. Ежеминутный вывод на консоли выглядит следующим образом:
Shell
HTTPError: 404 для http://www.google.com/py
1 | HTTPError404дляhttpwww.compy |
Попробуйте обновить код, используя проверенный хороший URL, к примеру https://www.google.com/. После этого вы можете перезапустить программу и проверить, что изменилось. Также можно попробовать обновить код для отправки сообщения или записи об ошибке. Для получения более подробной информации можете ознакомиться со статьями отправка писем smtp и логирование.
Вызов sleep() с декораторами
В некоторых случаях нужно повторно запустить неудачно выполненную в первый раз функцию. Зачастую это происходит, когда требуется повторить загрузку файла ввиду ранней перегрузки сервера. Как правило, никто не хочет делать частые запросы на серверы, поэтому добавление в Python вызова между каждым запросом предпочтительно.
Другим возможным случаем использования является необходимость проверки состояния пользовательского интерфейса во время автоматического теста. В зависимости от компьютера, на котором запускается тест, пользовательский интерфейс может грузиться быстрее или медленнее обычного. Это может изменить отображаемое на экране во время проверки программой чего-то.
В данном случае можно указать программе, чтобы та погрузилась в сон на мгновенье и затем проверить все опять через несколько секунд. Это может означать разницу между прохождением или провалом теста.
Для добавления системного вызова в Python можно использовать декоратор в каждом из данных случаев. Разберем следующий пример:
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:
try:
value = function(*args, **kwargs)
if value is None:
return
except:
print(f’Сон на {timeout} секунд’)
time.sleep(timeout)
retries += 1
return wrapper
return the_real_decorator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
importtime importurllib.request importurllib.error defsleep(timeout,retry=3) defthe_real_decorator(function) defwrapper(*args,**kwargs) retries= whileretries<retry try value=function(*args,**kwargs) ifvalue isNone return except print(f’Сон на {timeout} секунд’) time.sleep(timeout) retries+=1 returnwrapper returnthe_real_decorator |
является вашим декоратором. Он принимает значение и количество раз для повтора , что по умолчанию равняется 3. Внутри есть другая функция, , которая принимает декорируемую функцию.
В конечном итоге самая внутренняя функция принимает аргументы и ключевые слова, которые вы передаете декорируемой функции. Здесь все и происходит! Используется , чтобы повторить вызов функции. Если возникла ошибка, вызывается , увеличивается счетчик попыток и повторяется попытка запуска функции.
Теперь переписывается для использования нового декоратора:
Python
@sleep(3)
def uptime_bot(url):
try:
conn = urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
# Отправка admin / log
print(f’HTTPError: {e.code} для {url}’)
# Повторное поднятие ошибки исключения для декоратора
raise urllib.error.HTTPError
except urllib.error.URLError as e:
# Отправка admin / log
print(f’URLError: {e.code} для {url}’)
# Повторное поднятие ошибки исключения для декоратора
raise urllib.error.URLError
else:
# Сайт поднят
print(f'{url} поднят’)
if __name__ == ‘__main__’:
url = ‘http://www.google.com/py’
uptime_bot(url)
2 |
defuptime_bot(url) try conn=urllib.request.urlopen(url) excepturllib.error.HTTPError ase # Отправка admin / log print(f’HTTPError: {e.code} для {url}’) # Повторное поднятие ошибки исключения для декоратора raiseurllib.error.HTTPError excepturllib.error.URLError ase # Отправка admin / log print(f’URLError: {e.code} для {url}’) # Повторное поднятие ошибки исключения для декоратора raiseurllib.error.URLError else # Сайт поднят print(f'{url} поднят’) if__name__==’__main__’ url=’http://www.google.com/py’ uptime_bot(url) |
Здесь вы декорируете с помощью в 3 секунды. Вы также удалили оригинальный цикл и старый вызов . Декоратор теперь позаботится об этом.
Другое изменение состоит в добавлении внутри блоков, отвечающих за обработку исключений. Это нужно для правильной работы декоратора. Можно также написать декоратор, чтобы он отвечал за ошибки, однако ввиду того, что исключения касаются только , может быть лучше сохранить декоратор в текущем состоянии. В таком случае он будет работать c более широким ассортиментом функций.
Декоратору можно добавить несколько улучшений. Если число попыток заканчивается, и он по-прежнему проваливается, тогда можно сделать так, чтобы он повторно вызвал последнюю ошибку. Декоратор подождет 3 секунды после последней неудачи, что не всегда нужно. Можете попробовать поэкспериментировать самостоятельно.
How to Improve Sleep Quality and Duration
If you want to know how to sleep better and boost your performance there are 3 levers you can “pull” to give yourself a boost.
- Intensity
- Timing
- Duration
Intensity refers to how well you sleep. The percentage of sleeping time you spend in slow wave sleep and REM sleep largely determine the quality of your sleep each night.
Timing refers to when you go to sleep. What time do you go to bed? This factor is important for two reasons. First, if you get in bed around the same time each night, it is easier for your body to develop good sleep habits. Second, the time you go to sleep should be in accordance with your circadian rhythm.
Duration refers to how long you sleep. This one is simple: how much time do you spend sleeping each night?
How can you use these 3 levers to sleep better?
When it comes to intensity, the truth is that there isn’t much you can do. Your body largely manages the intensity of your sleep cycle (how much time you spend in slow wave sleep and REM sleep) for you. It adjusts automatically based on what you need and how much time you are spending asleep. Exercising consistently, being smart about light habits, and getting proper nutrition will help, but these actions only indirectly improve sleep intensity.
This is actually good news because it simplifies things for you. Because your body manages the quality of your sleep on its own, you only need to focus on two factors: timing (when you go to bed) and duration (how long you’re in bed).
If we make another assumption, then we can simplify the situation even further. That assumption is this: You wake up at approximately the same time each day.
If you wake up at about the same time each day, then your sleep duration is basically determined by when you go to bed. Generally speaking, if you get into bed earlier, then you’ll end up sleeping more. Improve the timing and you’ll improve the duration as well.
And that brings us to this practical punchline…
From a practical application standpoint, timing is perhaps the most important of the 3 levers of sleep. The intensity of your sleep is managed automatically by your body. The duration of your sleep is largely dependent on when you get into bed (assuming you wake up around the same time each morning). And that means getting to bed at an earlier, more consistent time is critical for improving the quality and duration of your sleep.
Очередь и блокировки
В модуле multiprocessing в python есть множество классов для создания параллельной программы. Среди них три основных класса: Process, Queue и Lock. Эти классы помогут вам построить параллельную программу.
Чтобы сделать параллельную программу полезной, вы должны знать, сколько ядер у вас на компьютере. Модуль Multiprocessing позволяет вам это знать. Следующий простой код напечатает количество ядер на вашем компьютере.
import multiprocessing print("Number of cpu : ", multiprocessing.cpu_count())
Следующий вывод может отличаться для вашего компьютера. Для меня количество ядер 8.
Ограничение одновременного доступа к ресурсам
Как разрешить доступ к ресурсу нескольким worker одновременно, но при этом ограничить их количество. Например, пул соединений может поддерживать фиксированное число одновременных подключений, или сетевое приложение может поддерживать фиксированное количество одновременных загрузок. Semaphore является одним из способов управления соединениями.
import logging import random import threading import time logging.basicConfig(level=logging.DEBUG, format='%(asctime)s (%(threadName)-2s) %(message)s', ) class ActivePool(object): def __init__(self): super(ActivePool, self).__init__() self.active = [] self.lock = threading.Lock() def makeActive(self, name): with self.lock: self.active.append(name) logging.debug('Running: %s', self.active) def makeInactive(self, name): with self.lock: self.active.remove(name) logging.debug('Running: %s', self.active) def worker(s, pool): logging.debug('Waiting to join the pool') with s: name = threading.currentThread().getName() pool.makeActive(name) time.sleep(0.1) pool.makeInactive(name) pool = ActivePool() s = threading.Semaphore(2) for i in range(4): t = threading.Thread(target=worker, name=str(i), args=(s, pool)) t.start()
В этом примере класс ActivePool является удобным способом отслеживания того, какие потоки могут запускаться в данный момент. Реальный пул ресурсов будет выделять соединение для нового потока и восстанавливать значение, когда поток завершен. В данном случае он используется для хранения имен активных потоков, чтобы показать, что только пять из них работают одновременно.
$ python threading_semaphore.py 2013-02-21 06:37:53,629 (0 ) Waiting to join the pool 2013-02-21 06:37:53,629 (1 ) Waiting to join the pool 2013-02-21 06:37:53,629 (0 ) Running: 2013-02-21 06:37:53,629 (2 ) Waiting to join the pool 2013-02-21 06:37:53,630 (3 ) Waiting to join the pool 2013-02-21 06:37:53,630 (1 ) Running: 2013-02-21 06:37:53,730 (0 ) Running: 2013-02-21 06:37:53,731 (2 ) Running: 2013-02-21 06:37:53,731 (1 ) Running: 2013-02-21 06:37:53,732 (3 ) Running: 2013-02-21 06:37:53,831 (2 ) Running: 2013-02-21 06:37:53,833 (3 ) Running: []
Пользовательские Классы таймера Python
Вы можете создать свой собственный класс таймера, чтобы делать все в соответствии с вашими потребностями. Одним из главных преимуществ создания пользовательского класса является то, что вы можете управлять всем временем в одной строке. Вам не нужно каждый раз импортировать класс time и записывать ссылки. Кроме того, вы можете сбросить свои данные и записать все прошлые исполнения времени, чтобы выбрать лучший алгоритм для вас.
В этом разделе будет создан пользовательский класс для управления временем и регистрации всех временных различий в ваших кодах. Давайте нырнем прямо в него –
<сильный>Timer.py –
Начнем с импорта модуля времени. Затем инициализируйте класс таймера python и начните определять атрибуты и методы. До сих пор мы включали только базовый атрибут, чтобы сохранить начальную ссылку класса. Чтобы сделать его более сложным, вы можете создать несколько атрибутов. На данный момент существует три метода, перечисленных ниже –
- start – (Необязательно) Чтобы запустить таймер.
- log – Регистрировать текущее прошедшее время относительно времени начала.
- milestone – Сбросить таймер и начать его отсчет с 0.
import time class Timer: def __init__(self): .time() def start(self): .time() def log(self): .time() - self.start print('Time log -',logger) def milestone(self): .time()
<сильный>example.py –
Примеры использования вышеуказанного класса приведены ниже. Как вы можете видеть, вы можете сохранить свой код чистым, создав пользовательский класс таймера и повысив гибкость.
import timer .Timer() for i in range(1000000): pass time.log() for i in range(1000000): pass time.log()
Выход –