Как я могу сделать задержку в python?

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.

Объект Condition

Объект condition это более продвинутая версия объекта event. Он представляет собой своего рода измененное состояние в приложении, и поток может дожидаться заданных условий, или сигнал о том, что условие было задано. Вот простой пример потребитель/производитель. Для начала, вам нужен объект condition:

Python

# представим добавление нового товара condition = threading.Condition()

1 2

# представим добавление нового товара

condition=threading.Condition()

Поток «Производитель» должен получить условие, прежде чем он сможет уведомить потребителя о наличии нового товара:

Python

# Поток производителя … генерация товара

condition.acquire() … добавление товара в ресурс

condition.notify() # отправляем уведомление о новом товаре condition.release()

1 2 3 4 5 6 7 8

# Поток производителя

…генерациятовара  

condition.acquire()

…добавлениетоваравресурс  


condition.notify()# отправляем уведомление о новом товаре

condition.release()

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

Python

# Поток потребителя condition.acquire() while True: … получаем товар из ресурсов if item: break condition.wait() # в противном случае ожидаем поступление товара condition.release() … обработка товара

1 2 3 4 5 6 7 8 9

# Поток потребителя

condition.acquire()

whileTrue

…получаемтоваризресурсов

ifitem

break

condition.wait()# в противном случае ожидаем поступление товара

condition.release()

…обработкатовара

Метод wait освобождает замок, блокирует настоящий поток, пока другой поток вызывает notify или notifyAll на тех же условиях, после чего замок восстанавливается. Если несколько потоков ожидает, метод notify активирует один из потоков, в то время как notifyAll активирует все потоки. Обход блока в методе wait возможен при помощи передачи значения timeout, в виде числа с плавающей запятой в секундах. После этого, метод выдаст результат после указанного времени, даже если мы не вызывали notify. Если вы используете timeout, вам нужно проверить ресурс, чтобы увидеть, произошло ли что-нибудь

Обратите внимание на то, объект condition связан с замком, и этот замок должен удерживаться, пред тем как вы сможете получить доступ к объекту condition. Соответственно, этот замок должен быть освобожден, когда вы выполнили все, что связанно с доступом к condition

В производственном коде вы должны использовать try-finally или with, как показано выше. Для того, чтобы связать condition с существующим замком, передайте замок конструктору Condition. Это также полезно, если вам нужно несколько объектов condition в одном ресурсе:

Python

lock = threading.RLock()

condition_1 = threading.Condition(lock) condition_2 = threading.Condition(lock)

1 2 3 4

lock=threading.RLock()

condition_1=threading.Condition(lock)

condition_2=threading.Condition(lock)

Вот и все! Вопросы будут у меня их и у самого есть, но мы справимся. Надеюсь.

Семафоры

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

Python

import threading

semaphore = threading.BoundedSemaphore() semaphore.acquire() # уменьшает счетчик (-1) … доступ к общим ресерсам semaphore.release() # увеличивает счетчик (+1)

1 2 3 4 5 6

importthreading

semaphore=threading.BoundedSemaphore()

semaphore.acquire()# уменьшает счетчик (-1)

…доступкобщимресерсам

semaphore.release()# увеличивает счетчик (+1)

Счетчик уменьшается, когда к семафору получают доступ, и увеличивается, когда доступ к нему теряют. Если счетчик доходит до нуля, когда к семафору получен доступ, то поток блокируется. Когда счетчик увеличивается и его показатель выше нуля – один из заблокированных потоков (если таковые имеются) снова заработает. Семафоры обычно используются для ограничения доступа к ресурсу с ограниченными возможностями, такие как подключение к сети или сервер базы данных. Просто установите счетчик на максимум, и семафор позаботиться об остальном.

Python

max_connections = 10

semaphore = threading.BoundedSemaphore(max_connections)

1 2 3

max_connections=10

semaphore=threading.BoundedSemaphore(max_connections)

Если вы не укажите значение для счетчика, счетчик инициализируется как 1. Модуль threading предлагает два варианта работы семафоров. Класс Semaphore обеспечивает безлимитный семафор, который позволяет вам вызывать release любое количество раз для увеличения счетчика. Чтобы избежать простых программных ошибок, как правило, лучше использовать класс BoundedSemaphore, который воспринимает как ошибку вызов release чаще, чем вы вызывали acquire.

Working around operating system bugs?

Should Python ensure that a monotonic clock is truly monotonic by computing the maximum with the clock value and the previous value?

Since it’s relatively straightforward to cache the last value returned using a static variable, it might be interesting to use this to make sure that the values returned are indeed monotonic.

  • Virtual machines provide less reliable clocks.
  • QueryPerformanceCounter() has known bugs (only one is not fixed yet)

Python may only work around a specific known operating system bug: KB274323 contains a code example to workaround the bug (use GetTickCount() to detect QueryPerformanceCounter() leap).

Issues with «correcting» non-monotonicities:

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

В 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

19 20 21 22

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 и логирование.

Example: Using sleep() function in Python

Follow the steps given below to add sleep() in your python script.

Step 1:

import time

Step 2: Add time.sleep()

The number 5 given as input to sleep(), is the number of seconds you want the code execution to halt when it is executed.

time.sleep(5)

Here is a working code along with messages inside print(), to show the delay of message display on the terminal when executed.

import time
print("Welcome to guru99 Python Tutorials")
time.sleep(5)
print("This message will be printed after a wait of 5 seconds")

Output:

Welcome to guru99 Python Tutorials
This message will be printed after a wait of 5 seconds

«Голое» исключение


Есть еще один способ поймать ошибку:

Python

try: 1 / 0 except: print(«You cannot divide by zero!»)

1 2 3 4

try

1

except

print(«You cannot divide by zero!»)

Но мы его не рекомендуем. На жаргоне Пайтона, это известно как голое исключение, что означает, что будут найдены вообще все исключения. Причина, по которой так делать не рекомендуется, заключается в том, что вы не узнаете, что именно за исключение вы выловите. Когда у вас возникло что-то в духе ZeroDivisionError, вы хотите выявить фрагмент, в котором происходит деление на ноль. В коде, написанном выше, вы не можете указать, что именно вам нужно выявить. Давайте взглянем еще на несколько примеров:

Python

my_dict = {«a»:1, «b»:2, «c»:3}

try: value = my_dict except KeyError: print(«That key does not exist!»)

1 2 3 4 5 6

my_dict={«a»1,»b»2,»c»3}

try

value=my_dict»d»

exceptKeyError

print(«That key does not exist!»)

Python

my_list =

try: my_list except IndexError: print(«That index is not in the list!»)

1 2 3 4 5 6

my_list=1,2,3,4,5

try

my_list6

exceptIndexError

print(«That index is not in the list!»)

В первом примере, мы создали словарь из трех элементов. После этого, мы попытались открыть доступ ключу, которого в словаре нет. Так как ключ не в словаре, возникает KeyError, которую мы выявили. Второй пример показывает список, длина которого состоит из пяти объектов. Мы попытались взять седьмой объект из индекса.

Помните, что списки в Пайтоне начинаются с нуля, так что когда вы говорите 6, вы запрашиваете 7. В любом случае, в нашем списке только пять объектов, по этой причине возникает IndexError, которую мы выявили. Вы также можете выявить несколько ошибок за раз при помощи одного оператора. Для этого существует несколько различных способов. Давайте посмотрим:

Python

my_dict = {«a»:1, «b»:2, «c»:3}

try: value = my_dict except IndexError: print(«This index does not exist!») except KeyError: print(«This key is not in the dictionary!») except: print(«Some other error occurred!»)

1 2 3 4 5 6 7 8 9 10

my_dict={«a»1,»b»2,»c»3}

try

value=my_dict»d»

exceptIndexError

print(«This index does not exist!»)

exceptKeyError

print(«This key is not in the dictionary!»)

except

print(«Some other error occurred!»)

Это самый стандартный способ выявить несколько исключений. Сначала мы попробовали открыть доступ к несуществующему ключу, которого нет в нашем словаре. При помощи try/except мы проверили код на наличие ошибки KeyError, которая находится во втором операторе except

Обратите внимание на то, что в конце кода у нас появилась «голое» исключение. Обычно, это не рекомендуется, но вы, возможно, будете сталкиваться с этим время от времени, так что лучше быть проинформированным об этом

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

Python

try: value = my_dict except (IndexError, KeyError): print(«An IndexError or KeyError occurred!»)

1 2 3 4

try

value=my_dict»d»

except(IndexError,KeyError)

print(«An IndexError or KeyError occurred!»)

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

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

В зависимости от сложности данной ошибки, вам может понадобиться выйти из программы. Иногда вам может понадобиться выполнить очистку, перед выходом из программы. Например, если вы открыли соединение с базой данных, вам нужно будет закрыть его, перед выходом из программы, или вы можете закончить с открытым соединением. Другой пример – закрытие дескриптора файла, к которому вы обращаетесь. Теперь нам нужно научиться убирать за собой. Это очень просто, если использовать оператор finally.

System Time

Name C Resolution Include Sleep Include Suspend
CLOCK_REALTIME 1 ns Yes Yes
CLOCK_REALTIME_COARSE 1 ns Yes Yes
GetSystemTimeAsFileTime 100 ns Yes Yes
gettimeofday() 1 µs Yes Yes
ftime() 1 ms Yes Yes
time() 1 sec Yes Yes

The «C Resolution» column is the resolution of the underlying C structure.

Examples of clock resolution on x86_64:

Name Operating system OS Resolution Python Resolution
CLOCK_REALTIME SunOS 5.11 10 ms 238 ns
CLOCK_REALTIME Linux 3.0 1 ns 238 ns
gettimeofday() Mac OS 10.6 1 µs 4 µs
CLOCK_REALTIME FreeBSD 8.2 11 ns 6 µs
CLOCK_REALTIME OpenBSD 5.0 10 ms 5 µs
CLOCK_REALTIME_COARSE Linux 3.3 1 ms 1 ms
CLOCK_REALTIME_COARSE Linux 3.0 4 ms 4 ms
GetSystemTimeAsFileTime() Windows Seven 16 ms 1 ms
ftime() Windows Seven 1 ms

The «OS Resolution» is the resolution announced by the operating system. The «Python Resolution» is the smallest difference between two calls to the time function computed in Python using the clock_resolution.py program.

The system time can be read using GetSystemTimeAsFileTime(), ftime() and time(). The resolution of the system time can be read using GetSystemTimeAdjustment().

Read the GetSystemTimeAsFileTime() documentation.

The system time can be set using SetSystemTime().


С этим читают