diff options
author | Yury Selivanov <yury@magic.io> | 2016-10-28 16:52:37 (GMT) |
---|---|---|
committer | Yury Selivanov <yury@magic.io> | 2016-10-28 16:52:37 (GMT) |
commit | a0c1ba608eb89b4e10155f7652c50a3ac0b709af (patch) | |
tree | 90e811ae976793876c5c04de7d91cbb7f1518fd9 /Lib/asyncio/base_futures.py | |
parent | bbcb79920b0e220c2e1b0e77db5aca2f3a2a52d4 (diff) | |
download | cpython-a0c1ba608eb89b4e10155f7652c50a3ac0b709af.zip cpython-a0c1ba608eb89b4e10155f7652c50a3ac0b709af.tar.gz cpython-a0c1ba608eb89b4e10155f7652c50a3ac0b709af.tar.bz2 |
Issue #28544: Implement asyncio.Task in C.
This implementation provides additional 10-20% speed boost for
asyncio programs.
The patch also fixes _asynciomodule.c to use Arguments Clinic, and
makes '_schedule_callbacks' an overridable method (as it was in 3.5).
Diffstat (limited to 'Lib/asyncio/base_futures.py')
-rw-r--r-- | Lib/asyncio/base_futures.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/Lib/asyncio/base_futures.py b/Lib/asyncio/base_futures.py new file mode 100644 index 0000000..64f7845 --- /dev/null +++ b/Lib/asyncio/base_futures.py @@ -0,0 +1,70 @@ +__all__ = [] + +import concurrent.futures._base +import reprlib + +from . import events + +Error = concurrent.futures._base.Error +CancelledError = concurrent.futures.CancelledError +TimeoutError = concurrent.futures.TimeoutError + + +class InvalidStateError(Error): + """The operation is not allowed in this state.""" + + +# States for Future. +_PENDING = 'PENDING' +_CANCELLED = 'CANCELLED' +_FINISHED = 'FINISHED' + + +def isfuture(obj): + """Check for a Future. + + This returns True when obj is a Future instance or is advertising + itself as duck-type compatible by setting _asyncio_future_blocking. + See comment in Future for more details. + """ + return getattr(obj, '_asyncio_future_blocking', None) is not None + + +def _format_callbacks(cb): + """helper function for Future.__repr__""" + size = len(cb) + if not size: + cb = '' + + def format_cb(callback): + return events._format_callback_source(callback, ()) + + if size == 1: + cb = format_cb(cb[0]) + elif size == 2: + cb = '{}, {}'.format(format_cb(cb[0]), format_cb(cb[1])) + elif size > 2: + cb = '{}, <{} more>, {}'.format(format_cb(cb[0]), + size - 2, + format_cb(cb[-1])) + return 'cb=[%s]' % cb + + +def _future_repr_info(future): + # (Future) -> str + """helper function for Future.__repr__""" + info = [future._state.lower()] + if future._state == _FINISHED: + if future._exception is not None: + info.append('exception={!r}'.format(future._exception)) + else: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(future._result) + info.append('result={}'.format(result)) + if future._callbacks: + info.append(_format_callbacks(future._callbacks)) + if future._source_traceback: + frame = future._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return info |