Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
09985d70
Commit
09985d70
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
006aa4d7
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
128 additions
and
0 deletions
+128
-0
timeout.py
stbi/Lib/site-packages/asgiref/timeout.py
+128
-0
No files found.
stbi/Lib/site-packages/asgiref/timeout.py
0 → 100644
View file @
09985d70
# This code is originally sourced from the aio-libs project "async_timeout",
# under the Apache 2.0 license. You may see the original project at
# https://github.com/aio-libs/async-timeout
# It is vendored here to reduce chain-dependencies on this library, and
# modified slightly to remove some features we don't use.
import
asyncio
import
sys
from
types
import
TracebackType
from
typing
import
Any
,
Optional
,
Type
# noqa
PY_37
=
sys
.
version_info
>=
(
3
,
7
)
class
timeout
:
"""timeout context manager.
Useful in cases when you want to apply timeout logic around block
of code or in cases when asyncio.wait_for is not suitable. For example:
>>> with timeout(0.001):
... async with aiohttp.get('https://github.com') as r:
... await r.text()
timeout - value in seconds or None to disable timeout logic
loop - asyncio compatible event loop
"""
def
__init__
(
self
,
timeout
:
Optional
[
float
],
*
,
loop
:
Optional
[
asyncio
.
AbstractEventLoop
]
=
None
)
->
None
:
self
.
_timeout
=
timeout
if
loop
is
None
:
loop
=
asyncio
.
get_event_loop
()
self
.
_loop
=
loop
self
.
_task
=
None
# type: Optional[asyncio.Task[Any]]
self
.
_cancelled
=
False
self
.
_cancel_handler
=
None
# type: Optional[asyncio.Handle]
self
.
_cancel_at
=
None
# type: Optional[float]
def
__enter__
(
self
)
->
"timeout"
:
return
self
.
_do_enter
()
def
__exit__
(
self
,
exc_type
:
Type
[
BaseException
],
exc_val
:
BaseException
,
exc_tb
:
TracebackType
,
)
->
Optional
[
bool
]:
self
.
_do_exit
(
exc_type
)
return
None
async
def
__aenter__
(
self
)
->
"timeout"
:
return
self
.
_do_enter
()
async
def
__aexit__
(
self
,
exc_type
:
Type
[
BaseException
],
exc_val
:
BaseException
,
exc_tb
:
TracebackType
,
)
->
None
:
self
.
_do_exit
(
exc_type
)
@property
def
expired
(
self
)
->
bool
:
return
self
.
_cancelled
@property
def
remaining
(
self
)
->
Optional
[
float
]:
if
self
.
_cancel_at
is
not
None
:
return
max
(
self
.
_cancel_at
-
self
.
_loop
.
time
(),
0.0
)
else
:
return
None
def
_do_enter
(
self
)
->
"timeout"
:
# Support Tornado 5- without timeout
# Details: https://github.com/python/asyncio/issues/392
if
self
.
_timeout
is
None
:
return
self
self
.
_task
=
current_task
(
self
.
_loop
)
if
self
.
_task
is
None
:
raise
RuntimeError
(
"Timeout context manager should be used "
"inside a task"
)
if
self
.
_timeout
<=
0
:
self
.
_loop
.
call_soon
(
self
.
_cancel_task
)
return
self
self
.
_cancel_at
=
self
.
_loop
.
time
()
+
self
.
_timeout
self
.
_cancel_handler
=
self
.
_loop
.
call_at
(
self
.
_cancel_at
,
self
.
_cancel_task
)
return
self
def
_do_exit
(
self
,
exc_type
:
Type
[
BaseException
])
->
None
:
if
exc_type
is
asyncio
.
CancelledError
and
self
.
_cancelled
:
self
.
_cancel_handler
=
None
self
.
_task
=
None
raise
asyncio
.
TimeoutError
if
self
.
_timeout
is
not
None
and
self
.
_cancel_handler
is
not
None
:
self
.
_cancel_handler
.
cancel
()
self
.
_cancel_handler
=
None
self
.
_task
=
None
return
None
def
_cancel_task
(
self
)
->
None
:
if
self
.
_task
is
not
None
:
self
.
_task
.
cancel
()
self
.
_cancelled
=
True
def
current_task
(
loop
:
asyncio
.
AbstractEventLoop
)
->
"asyncio.Task[Any]"
:
if
PY_37
:
task
=
asyncio
.
current_task
(
loop
=
loop
)
# type: ignore
else
:
task
=
asyncio
.
Task
.
current_task
(
loop
=
loop
)
if
task
is
None
:
# this should be removed, tokio must use register_task and family API
if
hasattr
(
loop
,
"current_task"
):
task
=
loop
.
current_task
()
# type: ignore
return
task
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment