Класс time() модуля datetime в python
Содержание:
- Модуль календаря
- Счетчик производительности
- Why is timeit() the best way to measure the execution time of Python code?
- Получение текущего объекта datetime
- Другой часовой пояс: временные зоны (timezones)
- What is TimeTuple?
- Отличия и особенности
- Times
- Range
- Testing
- Limitations
- Модуль времени
- Suspending Execution
- datetime.datetime
- Время выполнения программы
- Контроль доступа к ресурсам
- Получаем текущую дату и время
Модуль календаря
Модуль календаря предоставляет функции, связанные с календарем, включая функции печати текстового календаря на определенный месяц или год.
По умолчанию в календаре первый день недели — понедельник, а последний — воскресенье. Чтобы изменить это, вызовите функцию calendar.setfirstweekday ().
Вот список функций, доступных с модулем календаря —
Sr.No. | Функция с описанием |
---|---|
1 |
calendar.calendar (год, W = 2, L = 1, с = 6) Возвращает многострочную строку с календарем для года, отформатированного в три столбца, разделенных пробелами c. w — ширина в символах каждой даты; каждая строка имеет длину 21 * w + 18 + 2 * c. l — количество строк за каждую неделю. |
2 |
calendar.firstweekday () Возвращает текущую настройку для дня недели, который начинается каждую неделю. По умолчанию при первом импортировании календаря это 0, что означает понедельник. |
3 |
calendar.isleap (год) Возвращает True, если год является високосным; в противном случае Ложь. |
4 |
calendar.leapdays (y1, y2) Возвращает общее количество високосных дней в годах в пределах диапазона (y1, y2). |
5 |
calendar.month (год, месяц, ш = 2, л = 1) Возвращает многострочную строку с календарем на месяц месяц год, одну строку в неделю плюс две строки заголовка. w — ширина в символах каждой даты; каждая строка имеет длину 7 * w + 6. l — количество строк за каждую неделю. |
6 |
calendar.monthcalendar (год, месяц) Возвращает список списков целых. Каждый подсписок обозначает неделю. Дни вне месяца, месяца, года и года установлены на 0; дни в месяце устанавливаются на день, 1 и выше. |
7 |
calendar.monthrange (год, месяц) Возвращает два целых числа. Первый — это код дня недели для первого дня месяца месяца в году; второй — количество дней в месяце. Коды дня недели: от 0 (понедельник) до 6 (воскресенье); номера месяцев от 1 до 12. |
8 |
calendar.prcal (год, ш = 2, л = 1, с = 6) Как печать calendar.calendar (год, w, l, c). |
9 |
calendar.prmonth (год, месяц, ш = 2, л = 1) Как печать calendar.month (год, месяц, ш, л). |
10 |
calendar.setfirstweekday (день недели) Устанавливает первый день каждой недели в код дня недели. Коды дня недели: от 0 (понедельник) до 6 (воскресенье). |
11 |
calendar.timegm (tupletime) Инверсия time.gmtime: принимает момент времени в форме кортежа и возвращает тот же момент, что и число с плавающей запятой в секундах с начала эпохи. |
12 |
calendar.weekday (год, месяц, день) Возвращает код дня недели для указанной даты. Коды дня недели: от 0 (понедельник) до 6 (воскресенье); номера месяцев от 1 (январь) до 12 (декабрь). |
Счетчик производительности
Для измерения производительности важно иметь таймеры 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
Why is timeit() the best way to measure the execution time of Python code?
Here are a few reasons why we consider timeit() is the best way to measure execution time.
- It runs the code statement 1 million times that is the default value, and from that, it will return you the minimum time taken. You can also increase/decrease the 1 million by setting the argument number in time () function.
- While executing the test, the garbage collection is disabled every time by time () function.
- timeit() internally takes the accurate time as per your operating system being used. For example, it will use time.clock() for Windows operating system and time.time() for mac and Linux.
Summary
Timeit()is used to get the execution time taken for the small code given
Parameters used with timeit()
- stmt: This will take the code you want to measure the execution time
- setup: This will have setup details that need to be executed before stmt
- timer: This will have the timer value, timeit() already has a default value set, and we can ignore it.
- number: The stmt will execute as per the number is given here.
Получение текущего объекта datetime
Теперь для большинства реальных программ можно использовать текущее время и сохранить его как объект datetime. Мы можем использовать функцию datetime.now() для отображения текущего времени как объекта datetime.
from datetime import datetime
Давайте теперь рассмотрим пример.
from datetime import datetime current_datetime = datetime.now() print(current_datetime)
Выход
datetime.datetime(2020, 6, 27, 22, 45, 54, 267673)
Выход совпадает. В нем указано, что текущее время — 27 июня 2020 года, 22:45:54 по моему местному часовому поясу (IST).
Теперь мы также можем использовать базовые операторы для получения прошлого или будущего времени.
from datetime import datetime, timedelta current_datetime = datetime.now() # future dates one_year_future_date = current_datetime + timedelta(days=365) print('Current Date:', current_datetime) print('One year from now Date:', one_year_future_date) # past dates three_days_before_date = current_datetime - timedelta(days=3) print('Three days before Date:', three_days_before_date)
Выход
Current Date: 2020-06-27 22:45:54.267673 One year from now Date: 2021-06-27 22:45:54.267673 Three days before Date: 2020-06-24 22:45:54.267673
Другой часовой пояс: временные зоны (timezones)
Метод принимает в Python временную зону в качестве аргумента, так что объект datetime генерируется соответствующим образом.
Для получения информации с учетом часового пояса необходимо задействовать библиотеку pytz (если ее нет, потребуется инсталляция, для чего подойдет команда ).
Так как я нахожусь в Минске, давайте получим текущие временные значения (times) именно для Минска:
Строка в коде является объектом datetime, то есть все то же самое, что и ранее, но уже в полном соответствии с часовым поясом Республики Беларусь.
Когда надо узнать время в UTC, тоже пригодится модуль pytz:
Получить время UTC можно и без модуля pytz, т. к. datetime имеет полезное свойство timezone. Что же, давайте задействуем свойство timezone:
Таким образом, можно без проблем преобразовать текущие даты и значения времени в различные часовые пояса.
What is TimeTuple?
Many of Python’s time functions handle time as a tuple of 9 numbers, as shown below −
Index | Field | Values |
---|---|---|
4-digit year | 2008 | |
1 | Month | 1 to 12 |
2 | Day | 1 to 31 |
3 | Hour | 0 to 23 |
4 | Minute | 0 to 59 |
5 | Second | 0 to 61 (60 or 61 are leap-seconds) |
6 | Day of Week | 0 to 6 (0 is Monday) |
7 | Day of year | 1 to 366 (Julian day) |
8 | Daylight savings | -1, 0, 1, -1 means library determines DST |
The above tuple is equivalent to struct_time structure. This structure has following attributes −
Index | Attributes | Values |
---|---|---|
tm_year | 2008 | |
1 | tm_mon | 1 to 12 |
2 | tm_mday | 1 to 31 |
3 | tm_hour | 0 to 23 |
4 | tm_min | 0 to 59 |
5 | tm_sec | 0 to 61 (60 or 61 are leap-seconds) |
6 | tm_wday | 0 to 6 (0 is Monday) |
7 | tm_yday | 1 to 366 (Julian day) |
8 | tm_isdst | -1, 0, 1, -1 means library determines DST |
Отличия и особенности
JavaScript прекрасен тем, что его можно запустить в консоли любого современного браузера. Это для него родная среда, и JS легко работает со страницами, объектами на ней, вкладками браузера и всем, что с ним связано.
Python — более универсальный язык, который работает не только с браузерами, поэтому для него нужен отдельный интерпретатор. Интерпретатор — это программа, которая берёт исходный код и выполняет команду за командой. Вы можете написать отличный код, но чтобы его исполнить, вам всегда нужен будет интерпретатор.
Есть два способа запустить Python-код:
1. Поставить Python себе на компьютер — этот способ хорош, если вы решили основательно изучить язык или просто любите, когда всё быстро и под контролем. Скачать Python можно с официального сайта — есть версии для всех основных операционных систем. Из минусов — нужно разбираться в параметрах установки и настройки и уметь работать с командной строкой. Плюсы — полный контроль и быстродействие.
2. Использовать онлайн-сервисы, например, этот: onlinegdb.com/online_python_compiler. Работает точно так же — пишете код, нажимаете кнопку Run и смотрите на результат.
Минусы: так как это онлайн-сервис, им пользуется одновременно много человек, поэтому быстродействия от него ждать не стоит. С подключением внешних модулей тоже могут возникнуть проблемы, но с этим можно разобраться, если потратить немного времени.
Плюс: не нужно ничего настраивать и устанавливать, всё работает сразу из браузера. Есть подсветка синтаксиса, сообщения об ошибках и возможность сохранения кода.
Сейчас мы напишем таймер с оглядкой на онлайновый сервис. А отдельно ещё расскажем об установке.
Times
Times is a small, minimalistic, Python library for dealing with time
conversions to and from timezones, for once and for all.
Accepting time
Never work with _local_ times. Whenever you must accept local time input (e.g.
from a user), convert it to universal time immediately:
`pycon
>>> times.to_universal(local_time, 'Europe/Amsterdam')
datetime.datetime(2012, 2, 1, 10, 31, 45, 781262)
`
The second argument can be a pytz.timezone instance, or a timezone string.
If the local_time variable already holds timezone info, you _must_ leave out
the source timezone from the call.
To enforce best practices, times will never implicitly convert times for you,
even if that would technically be possible.
Date Strings
If you want to accepting datetime representations in string form (for example,
from JSON APIs), you can convert them to universal datetimes easily:
`pycon
>>> import time, times
>>> print times.to_universal('2012-02-03 11:59:03-0500') # auto-detects source timezone
`
Times utilizes the string parsing routines available in . Note
that the source timezone is auto-detected from the string. If the string
contains a timezone offset, you are not allowed to explicitly specify one.
If the string does not contain any timezone offset, you _must_ specify the
source timezone explicitly:
`pycon
>>> print times.to_universal('2012-02-03 11:59:03', 'Europe/Amsterdam')
`
This is the inverse of times.format().
POSIX timestamps
If you prefer working with UNIX (POSIX) timestamps, you can convert them to
safe datetime representations easily:
`pycon
>>> import time, times
>>> print times.to_universal(time.time())
2012-02-03 11:59:03.588419
`
Note that to_universal auto-detects that you give it a UNIX timestamp.
To get the UNIX timestamp representation of a universal datetime, use:
`pycon
>>> print times.to_unix(universal_time)
`
Current time
When you want to record the current time, you can use this convenience method:
`pycon
>>> import times
>>> print times.now()
datetime.datetime(2012, 2, 1, 11, 51, 27, 621491)
`
Range
If you want to iterate over a period, you can use the method:
Note
Supported units for are: , , ,
, , and
You can pass an amount for the passed unit to control the length of the gap:
You can also directly iterate over the instance,
the unit will be in this case:
You can check if a instance is inside a period using the keyword:
Testing
The testing methods allow you to set a instance (real or mock) to be returned
when a «now» instance is created.
The provided instance will be returned specifically under the following conditions:
- A call to the method, ex. .
- When the string «now» is passed to the method, ex.
If you don’t want to manually clear the mock (or you are afraid of forgetting),
you can use the provided contextmanager.
Limitations
Even though the class is a subclass of ,
there are some rare cases where it can’t replace the native class directly.
Here is a list (non-exhaustive) of the reported cases with a possible solution, if any:
-
will use the the function to determine the type of the object by default. To work around it you can register a new adapter:
-
(former ) and will use the the function to determine the type of the object by default. To work around it you can register a new adapter:
-
will use the method to store datetimes in the database. However, since is always timezone aware, the offset information will always be returned by raising an error, at least for MySQL databases. To work around it, you can either create your own or use the previous workaround for :
Модуль времени
В Python есть популярный модуль времени , который предоставляет функции для работы со временем и для преобразования между представлениями. Вот список всех доступных методов.
Sr.No. | Описание функции |
---|---|
1 | time.altzone
Смещение местного часового пояса DST в секундах к западу от UTC, если оно определено. Это отрицательно, если местный часовой пояс DST расположен к востоку от UTC (как в Западной Европе, включая Великобританию). Используйте это, если дневной свет ненулевой. |
2 | time.asctime ()
Принимает кортеж времени и возвращает читаемую 24-символьную строку, например, «Tue Dec 11 18:07:14 2008». |
3 | time.clock ()
Возвращает текущее время процессора в виде числа с плавающей запятой в секундах. Для измерения вычислительных затрат различных подходов значение time.clock более полезно, чем значение time.time (). |
4 | time.ctime ()
Как asctime (localtime (secs)) и без аргументов, как asctime () |
5 | time.gmtime ()
Принимает момент, выраженный в секундах с начала эпохи, и возвращает кортеж времени t с временем UTC. Примечание — t.tm_isdst всегда равно 0 |
6 | time.localtime ()
Принимает момент, выраженный в секундах с начала эпохи, и возвращает кортеж времени t с местным временем (t.tm_isdst равно 0 или 1, в зависимости от того, применяется ли DST к мгновенным секундам по локальным правилам). |
7 | time.mktime (tupletime)
Принимает момент, выраженный как кортеж времени по местному времени, и возвращает значение с плавающей запятой с моментом, выраженным в секундах с начала эпохи. |
8 | time.sleep (сек)
Приостанавливает вызывающий поток на секунды. |
9 | time.strftime (FMT )
Принимает момент, выраженный как кортеж времени по местному времени, и возвращает строку, представляющую момент, как указано в строке fmt. |
10 | time.strptime (str, fmt = ‘% a% b% d% H:% M:% S% Y’)
Анализирует str в соответствии со строкой формата fmt и возвращает момент в формате кортежа времени. |
11 | time.time ()
Возвращает текущий момент времени, число с плавающей точкой в секундах с начала эпохи. |
12 | time.tzset ()
Сбрасывает правила преобразования времени, используемые библиотечными процедурами. Переменная окружения TZ определяет, как это делается. |
Есть два важных атрибута, доступных с модулем времени. Они —
Sr.No. | Атрибут и описание |
---|---|
1 |
time.timezone Атрибут time.timezone — это смещение в секундах местного часового пояса (без DST) от UTC (> 0 в Северной и Южной Америке; <= 0 в большинстве стран Европы, Азии, Африки). |
2 |
time.tzname Атрибут time.tzname — это пара строк, зависящих от локали, которые являются именами местного часового пояса без и с DST соответственно. |
Suspending Execution
One really useful Python time function is , which suspends the thread’s execution for a specified amount of time.
For example, you can suspend your program’s execution for 10 seconds like this:
>>>
Your program will print the first formatted string, then pause for 10 seconds, and finally print the second formatted string.
You can also pass fractional seconds to :
>>>
is useful for testing or making your program wait for any reason, but you must be careful not to halt your production code unless you have good reason to do so.
Before Python 3.5, a signal sent to your process could interrupt . However, in 3.5 and later, will always suspend execution for at least the amount of specified time, even if the process receives a signal.
is just one Python time function that can help you test your programs and make them more robust.
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.
Время выполнения программы
Существует множество разных задач, для решения которых нужно найти время, потраченное на работу программы либо отдельных ее блоков. Чтобы найти данную величину, достаточно посчитать разницу в секундах между точкой старта определенной функции и местом, где она завершает свою работу. В следующем примере демонстрируется применение методов 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(). Принцип ее применения такой же, как и в предыдущем примере, однако здесь результат обладает гарантированной точностью и независим от внешних условий. Для отображения времени в более комфортной форме используется небольшое форматирование результата.
Контроль доступа к ресурсам
Помимо синхронизации операций с потоками, также важно иметь возможность контролировать доступ к общим ресурсам, чтобы предотвратить повреждение данных. Встроенные в Python структуры данных (списки, словари и т
д.) являются поточно-ориентированными. Другие структуры данных, реализованные в Python, и более простые типы (целые числа и числа с плавающей запятой) имеют такой защиты. Для защиты от одновременного доступа к объекту используйте объект Lock
Встроенные в Python структуры данных (списки, словари и т. д.) являются поточно-ориентированными. Другие структуры данных, реализованные в Python, и более простые типы (целые числа и числа с плавающей запятой) имеют такой защиты. Для защиты от одновременного доступа к объекту используйте объект Lock.
import logging import random import threading import time logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s', ) class Counter(object): def __init__(self, start=0): self.lock = threading.Lock() self.value = start def increment(self): logging.debug('Waiting for lock') self.lock.acquire() try: logging.debug('Acquired lock') self.value = self.value + 1 finally: self.lock.release() def worker(c): for i in range(2): pause = random.random() logging.debug('Sleeping %0.02f', pause) time.sleep(pause) c.increment() logging.debug('Done') counter = Counter() for i in range(2): t = threading.Thread(target=worker, args=(counter,)) t.start() logging.debug('Waiting for worker threads') main_thread = threading.currentThread() for t in threading.enumerate(): if t is not main_thread: t.join() logging.debug('Counter: %d', counter.value)
В этом примере функция worker() увеличивает экземпляр Counter, который управляет Lock, чтобы два потока не могли одновременно изменить свое внутреннее состояние. Если Lock не использовался, можно пропустить изменение значения атрибута.
$ python threading_lock.py (Thread-1 ) Sleeping 0.47 (Thread-2 ) Sleeping 0.65 (MainThread) Waiting for worker threads (Thread-1 ) Waiting for lock (Thread-1 ) Acquired lock (Thread-1 ) Sleeping 0.90 (Thread-2 ) Waiting for lock (Thread-2 ) Acquired lock (Thread-2 ) Sleeping 0.11 (Thread-2 ) Waiting for lock (Thread-2 ) Acquired lock (Thread-2 ) Done (Thread-1 ) Waiting for lock (Thread-1 ) Acquired lock (Thread-1 ) Done (MainThread) Counter: 4
Чтобы выяснить, применил ли другой поток блокировку, не задерживая текущий поток, передайте значение False аргументу blocking функции acquire().
В следующем примере worker() пытается применить блокировку три раза и подсчитывает, сколько попыток нужно сделать. А lock_holder() выполняет циклическое переключение между снятием и запуском блокировки с короткими паузами в каждом состоянии, используемом для имитации загрузки.
import logging import threading import time logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s', ) def lock_holder(lock): logging.debug('Starting') while True: lock.acquire() try: logging.debug('Holding') time.sleep(0.5) finally: logging.debug('Not holding') lock.release() time.sleep(0.5) return def worker(lock): logging.debug('Starting') num_tries = 0 num_acquires = 0 while num_acquires < 3: time.sleep(0.5) logging.debug('Trying to acquire') have_it = lock.acquire(0) try: num_tries += 1 if have_it: logging.debug('Iteration %d: Acquired', num_tries) num_acquires += 1 else: logging.debug('Iteration %d: Not acquired', num_tries) finally: if have_it: lock.release() logging.debug('Done after %d iterations', num_tries) lock = threading.Lock() holder = threading.Thread(target=lock_holder, args=(lock,), name='LockHolder') holder.setDaemon(True) holder.start() worker = threading.Thread(target=worker, args=(lock,), name='Worker') worker.start()
worker() требуется более трех итераций, чтобы применить блокировку три раза.
$ python threading_lock_noblock.py (LockHolder) Starting (LockHolder) Holding (Worker ) Starting (LockHolder) Not holding (Worker ) Trying to acquire (Worker ) Iteration 1: Acquired (Worker ) Trying to acquire (LockHolder) Holding (Worker ) Iteration 2: Not acquired (LockHolder) Not holding (Worker ) Trying to acquire (Worker ) Iteration 3: Acquired (LockHolder) Holding (Worker ) Trying to acquire (Worker ) Iteration 4: Not acquired (LockHolder) Not holding (Worker ) Trying to acquire (Worker ) Iteration 5: Acquired (Worker ) Done after 5 iterations
Получаем текущую дату и время
Datetime включает в себя разные классы, позволяющие получать нужные временные данные:
- datetime.date: день, месяц и год;
- datetime.time: время в часах, минутах, секундах, а также микросекундах. Тут дата значения не имеет;
- datetime.datetime: здесь хранятся атрибуты date и time.
Для примера можно вывести в терминал текущую (current) дату и время. Можно воспользоваться объектом datetime.datetime — из него довольно просто извлекаются объекты date и time. Сначала следует импортировать требуемый модуль:
Да, это выглядит странновато, т. к. речь идет о получении класса datetime из модуля datetime, однако это 2 разные вещи. Далее следует воспользоваться функцией — она позволит получить объект с текущим временем и датой.
Набрав код выше, вы увидите на экране следующее (в вашем случае вывод изменится, ведь минуты не стоят на месте):
Что произошло? Функция отобразила объект, причем с датой и временем создания этого самого объекта. В результате была выведена соответствующая строка. Однако никто не мешает получить временные атрибуты отдельно:
Таким образом, метод вполне годится для получения текущей даты и времени. Но что делать, если надо получить лишь дату?