Merge
This commit is contained in:
commit
e39ebe45c4
|
@ -183,6 +183,18 @@ The module defines the following functions and data items:
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
.. function:: wallclock()
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
single: Wallclock
|
||||||
|
single: benchmarking
|
||||||
|
|
||||||
|
Return the current time in fractions of a second to the system's best ability.
|
||||||
|
Use this when the most accurate representation of wall-clock is required, i.e.
|
||||||
|
when "processor time" is inappropriate. The reference point of the returned
|
||||||
|
value is undefined so only the difference of consecutive calls is valid.
|
||||||
|
|
||||||
|
.. versionadded: 3.3
|
||||||
|
|
||||||
.. function:: ctime([secs])
|
.. function:: ctime([secs])
|
||||||
|
|
||||||
|
|
|
@ -164,12 +164,15 @@ Notes:
|
||||||
(4)
|
(4)
|
||||||
Only on Mac OS X platform.
|
Only on Mac OS X platform.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
Support for Chrome/Chromium has been added.
|
||||||
|
|
||||||
Here are some simple examples::
|
Here are some simple examples::
|
||||||
|
|
||||||
url = 'http://www.python.org/'
|
url = 'http://docs.python.org/'
|
||||||
|
|
||||||
# Open URL in a new tab, if a browser window is already open.
|
# Open URL in a new tab, if a browser window is already open.
|
||||||
webbrowser.open_new_tab(url + 'doc/')
|
webbrowser.open_new_tab(url)
|
||||||
|
|
||||||
# Open URL in new window, raising the window if possible.
|
# Open URL in new window, raising the window if possible.
|
||||||
webbrowser.open_new(url)
|
webbrowser.open_new(url)
|
||||||
|
|
|
@ -396,10 +396,12 @@ New module: :mod:`faulthandler`.
|
||||||
time
|
time
|
||||||
----
|
----
|
||||||
|
|
||||||
* The :mod:`time` module has new :func:`~time.clock_getres` and
|
The :mod:`time` module has new functions:
|
||||||
:func:`~time.clock_gettime` functions and ``CLOCK_xxx`` constants.
|
|
||||||
:func:`~time.clock_gettime` can be used with :data:`time.CLOCK_MONOTONIC` to
|
* :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and
|
||||||
get a monotonic clock.
|
``CLOCK_xxx`` constants. :func:`~time.clock_gettime` can be used with
|
||||||
|
:data:`time.CLOCK_MONOTONIC` to get a monotonic clock.
|
||||||
|
* :func:`~time.wallclock`: monotonic clock.
|
||||||
|
|
||||||
(Contributed by Victor Stinner in :issue:`10278`)
|
(Contributed by Victor Stinner in :issue:`10278`)
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,13 @@ __all__ = ["BZ2File", "BZ2Compressor", "BZ2Decompressor", "compress",
|
||||||
__author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
|
__author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
|
||||||
|
|
||||||
import io
|
import io
|
||||||
import threading
|
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
|
try:
|
||||||
|
from threading import RLock
|
||||||
|
except ImportError:
|
||||||
|
from dummy_threading import RLock
|
||||||
|
|
||||||
from _bz2 import BZ2Compressor, BZ2Decompressor
|
from _bz2 import BZ2Compressor, BZ2Decompressor
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,7 +57,7 @@ class BZ2File(io.BufferedIOBase):
|
||||||
"""
|
"""
|
||||||
# This lock must be recursive, so that BufferedIOBase's
|
# This lock must be recursive, so that BufferedIOBase's
|
||||||
# readline(), readlines() and writelines() don't deadlock.
|
# readline(), readlines() and writelines() don't deadlock.
|
||||||
self._lock = threading.RLock()
|
self._lock = RLock()
|
||||||
self._fp = None
|
self._fp = None
|
||||||
self._closefp = False
|
self._closefp = False
|
||||||
self._mode = _MODE_CLOSED
|
self._mode = _MODE_CLOSED
|
||||||
|
|
|
@ -463,6 +463,13 @@ class BZ2FileTest(BaseTest):
|
||||||
for t in threads:
|
for t in threads:
|
||||||
t.join()
|
t.join()
|
||||||
|
|
||||||
|
def testWithoutThreading(self):
|
||||||
|
bz2 = support.import_fresh_module("bz2", blocked=("threading",))
|
||||||
|
with bz2.BZ2File(self.filename, "wb") as f:
|
||||||
|
f.write(b"abc")
|
||||||
|
with bz2.BZ2File(self.filename, "rb") as f:
|
||||||
|
self.assertEqual(f.read(), b"abc")
|
||||||
|
|
||||||
def testMixedIterationAndReads(self):
|
def testMixedIterationAndReads(self):
|
||||||
self.createTempFile()
|
self.createTempFile()
|
||||||
linelen = len(self.TEXT_LINES[0])
|
linelen = len(self.TEXT_LINES[0])
|
||||||
|
|
|
@ -332,6 +332,13 @@ class TimeTestCase(unittest.TestCase):
|
||||||
self.assertEqual(time.strftime('%Z', tt), tzname)
|
self.assertEqual(time.strftime('%Z', tt), tzname)
|
||||||
|
|
||||||
|
|
||||||
|
def test_wallclock(self):
|
||||||
|
t0 = time.wallclock()
|
||||||
|
time.sleep(0.1)
|
||||||
|
t1 = time.wallclock()
|
||||||
|
t = t1 - t0
|
||||||
|
self.assertAlmostEqual(t, 0.1, places=2)
|
||||||
|
|
||||||
class TestLocale(unittest.TestCase):
|
class TestLocale(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.oldloc = locale.setlocale(locale.LC_ALL)
|
self.oldloc = locale.setlocale(locale.LC_ALL)
|
||||||
|
|
|
@ -447,6 +447,11 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #10278: Add time.wallclock() function, monotonic clock.
|
||||||
|
|
||||||
|
- Issue #13809: Fix regression where bz2 module wouldn't work when threads are
|
||||||
|
disabled. Original patch by Amaury Forgeot d'Arc.
|
||||||
|
|
||||||
- Issue #13589: Fix some serialization primitives in the aifc module.
|
- Issue #13589: Fix some serialization primitives in the aifc module.
|
||||||
Patch by Oleg Plakhotnyuk.
|
Patch by Oleg Plakhotnyuk.
|
||||||
|
|
||||||
|
|
|
@ -737,6 +737,52 @@ the local timezone used by methods such as localtime, but this behaviour\n\
|
||||||
should not be relied on.");
|
should not be relied on.");
|
||||||
#endif /* HAVE_WORKING_TZSET */
|
#endif /* HAVE_WORKING_TZSET */
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
time_wallclock(PyObject *self, PyObject *unused)
|
||||||
|
{
|
||||||
|
#if defined(MS_WINDOWS) && !defined(__BORLANDC__)
|
||||||
|
return time_clock(self, NULL);
|
||||||
|
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
||||||
|
static int clk_index = 0;
|
||||||
|
clockid_t clk_ids[] = {
|
||||||
|
#ifdef CLOCK_MONOTONIC_RAW
|
||||||
|
CLOCK_MONOTONIC_RAW,
|
||||||
|
#endif
|
||||||
|
CLOCK_MONOTONIC
|
||||||
|
#ifdef CLOCK_REALTIME
|
||||||
|
/* On Linux, CLOCK_REALTIME uses the same clock than gettimeofday(),
|
||||||
|
but clock_gettime() has a nanosecond resolution. */
|
||||||
|
, CLOCK_REALTIME
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
int ret;
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
|
while (0 <= clk_index) {
|
||||||
|
clockid_t clk_id = clk_ids[clk_index];
|
||||||
|
ret = clock_gettime(clk_id, &tp);
|
||||||
|
if (ret == 0)
|
||||||
|
return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9);
|
||||||
|
|
||||||
|
clk_index++;
|
||||||
|
if (Py_ARRAY_LENGTH(clk_ids) <= clk_index)
|
||||||
|
clk_index = -1;
|
||||||
|
}
|
||||||
|
return time_time(self, NULL);
|
||||||
|
#else
|
||||||
|
return time_time(self, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(wallclock_doc,
|
||||||
|
"wallclock() -> float\n\
|
||||||
|
\n\
|
||||||
|
Return the current time in fractions of a second to the system's best\n\
|
||||||
|
ability. Use this when the most accurate representation of wall-clock is\n\
|
||||||
|
required, i.e. when \"processor time\" is inappropriate. The reference point\n\
|
||||||
|
of the returned value is undefined so only the difference of consecutive\n\
|
||||||
|
calls is valid.");
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PyInit_timezone(PyObject *m) {
|
PyInit_timezone(PyObject *m) {
|
||||||
/* This code moved from PyInit_time wholesale to allow calling it from
|
/* This code moved from PyInit_time wholesale to allow calling it from
|
||||||
|
@ -872,6 +918,7 @@ static PyMethodDef time_methods[] = {
|
||||||
#ifdef HAVE_WORKING_TZSET
|
#ifdef HAVE_WORKING_TZSET
|
||||||
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
|
{"tzset", time_tzset, METH_NOARGS, tzset_doc},
|
||||||
#endif
|
#endif
|
||||||
|
{"wallclock", time_wallclock, METH_NOARGS, wallclock_doc},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue