Comments (7)
This isn't really an issue with aiohttp, it's an issue with your architecture/coding practices.
If you always use async with
when creating a session, then you won't have any unclosed sessions. Alternatively, I've seen libraries that provide context manager stacks as part of an application's lifecycle (maybe combined with dependency injection). You can use a linting rule or something to enforce this usage across your code.
from aiohttp.
Thanks for your prompt reply.
While I know that async with
is the recommended pratice, there are situations where we might be called upon to debug code outside of our control, such as code written by others or in third party modules. (aiohttps is used by many third party aio modules).
Unfortunately, when these external sources don't use async with
, it can be challenging to identify the unclosed sessions.
Only after pingpointing these unclose sessions, can we suggest adpoting async with
as a best pratice.
So I think this is real use case.
from aiohttp.
Hmm, the issue is much the same as any other asyncio primitive, so we should probably do the same as asyncio does or suggest similar changes there.
The only thing I can think of is to get the current traceback when the object is initialised and then include that in the warning. This would probably need to be done only when using debug mode to avoid the overhead.
from aiohttp.
If you want to give it a go, it'd probably look something like:
from aiohttp.helpers import DEBUG
if DEBUG:
self._tb = traceback.extract_stack()
from aiohttp.
hello,
Do you mean save the traceback stack during the session __init__
if DEBUG mode is on, and display it in the error message as follows ?
Like:
class ClientSession:
def __init__(
self,
...
) -> None:
+ if DEBUG:
+ import traceback
+ self._tb = traceback.extract_stack()
...
def __del__(self, _warnings: Any = warnings) -> None:
if not self.closed:
kwargs = {"source": self}
_warnings.warn(
f"Unclosed client session {self!r}", ResourceWarning, **kwargs
)
message = "Unclosed client session"
+ if DEBUG:
+ message += f"\nSession creation traceback stack: {self._tb}"
context = {"client_session": self, "message": message}
if self._source_traceback is not None:
context["source_traceback"] = self._source_traceback
self._loop.call_exception_handler(context)
from aiohttp.
That was my suggestion, yes. Feel free to make a PR if you've got it working. Will need a test to show it's working correctly too (needs to be marked with @pytest.mark.dev_mode
).
from aiohttp.
sorry, I just found it's already been implemented, when setting the env var PYTHONASYNCIODEBUG=1
, the unclosed session gives already the creation traceback, all is good now, thank for your help.
from aiohttp.
Related Issues (20)
- 404 returned if only compressed file exists
- loop.run_forever terminated by exception HOT 4
- web_ws - Can't close tcp socket when receiving a close message from client. HOT 18
- Large payloads lead to BrokenPipe inside a request context manager HOT 1
- OSError : bind(): bad family HOT 1
- Error upon attempt to download https://dieunbestechlichen.com/feed HOT 3
- aiohttp 3.9.3 fails to install on Python 3.13.0a4 HOT 4
- aiohttp.web listens both TCP and Unix socket if `-U` has been supplied HOT 4
- TCPConnector / enable `limit_per_url` HOT 5
- Stability issues with gunicorn --max-requests HOT 11
- ClientSession cannot reuse connection pool HOT 4
- Using underscore to name a field in a named tuple HOT 2
- Request Pynacl Encryption Middleware HOT 13
- ASGI support HOT 4
- tests/test_pytest_plugin.py::test_aiohttp_plugin fails on Alpine Linux (python 3.11 and python 3.12) HOT 12
- ERROR: aiohttp has an invalid wheel, .dist-info directory 'yarl-1.9.4.dist-info' does not start with 'aiohttp' HOT 2
- Pass max_length parameter to ZLibDecompressor HOT 5
- "Unclosed client session" when initialization fails HOT 2
- Expired cookies not listed in the response cookies HOT 2
- Reserve generic property on app to store app state in a typed fashion HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from aiohttp.