Repository navigation
3.11.5 regression: StreamWriter.__del__ fails if event loop is already closed #109538
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Sep 18, 2023 - added a commit that references this issue
on Sep 18, 2023 Same problem here
I have the same problem with 3.11.6. Thanks for reporting it.
Reacted by VenticelloIs there a workaround?
Is there a workaround?
Use gc.collect() may help
Here is my workaround.
@pytest.fixture def event_loop(): policy = asyncio.get_event_loop_policy() loop = policy.new_event_loop() loop.set_debug(True) yield loop gc.collect() loop.close()
@dpr-0 Thanks, but just adding that to my program didn't prevent the messages.
@dpr-0 Thanks, but just adding that to my program didn't prevent the messages.
Hope you can find the problem T^T
Same problem for python 3.12.0
Reacted by anton-m-py and EduardoSorry for the inconvenience. Can you (or anyone else reading this) submit a PR for the main branch? We will then backport the PR to 3.12 and 3.11.
Reacted by Carol WillingSorry for the inconvenience. Can you (or anyone else reading this) submit a PR for the main branch? We will then backport the PR to 3.12 and 3.11.
What is the desired behaviour if the event loop is already closed when the StreamWriter is destroyed? Should
__del__just become a no-op?8 remaining items
- added a commit that references this issue
on Nov 16, 2023 - added a commit that references this issue
on Nov 20, 2023 Did anyone find a solution?
Did anyone find a solution?
It's fixed in the main, 3.12 and 3.11 branches. It will be fixed in the next official releases of 3.11 and 3.12 from python.org (within 1-2 months).
Reacted by Andrei, DPR, Aleksey, Dmitriy Tatarkin, Markus, shaliamekh-innowise and Rajesh Kumar Nallabanda- added 2 commits that reference this issue
on Dec 8, 2023 Did anyone find a solution?
It's fixed in the main, 3.12 and 3.11 branches. It will be fixed in the next official releases of 3.11 and 3.12 from python.org (within 1-2 months).
Is this fix included in 3.11.7?
Because I'm still able to reproduce it with Python 3.11.7Edit: nevermind, I used 3.11.6 by accident. All good
Reacted by DPRJust so you know, on python 3.11.9 with this setting for
pytest:[tool.pytest.ini_options] asyncio_mode = "auto" filterwarnings = ["error"]the suite still raises an error from ignored warning:
def _warn_teardown_exception( hook_name: str, hook_impl: HookImpl, e: BaseException ) -> None: msg = "A plugin raised an exception during an old-style hookwrapper teardown.\n" msg += f"Plugin: {hook_impl.plugin_name}, Hook: {hook_name}\n" msg += f"{type(e).__name__}: {e}\n" msg += "For more information see https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluggyTeardownRaisedWarning" # noqa: E501 > warnings.warn(PluggyTeardownRaisedWarning(msg), stacklevel=5) E pluggy.PluggyTeardownRaisedWarning: A plugin raised an exception during an old-style hookwrapper teardown. E Plugin: unraisableexception, Hook: pytest_runtest_setup E PytestUnraisableExceptionWarning: Exception ignored in: <function StreamWriter.__del__ at 0xffffb9f4d620> E E Traceback (most recent call last): E File "/usr/local/lib/python3.11/asyncio/streams.py", line 411, in __del__ E warnings.warn("loop is closed", ResourceWarning) E ResourceWarning: loop is closed E E For more information see https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluggyTeardownRaisedWarning ../virtualenvs/project-bTydf30B-py3.11/lib/python3.11/site-packages/pluggy/_callers.py:50: PluggyTeardownRaisedWarningdef unraisable_exception_runtest_hook() -> Generator[None, None, None]: with catch_unraisable_exception() as cm: yield if cm.unraisable: if cm.unraisable.err_msg is not None: err_msg = cm.unraisable.err_msg else: err_msg = "Exception ignored in" msg = f"{err_msg}: {cm.unraisable.object!r}\n\n" msg += "".join( traceback.format_exception( cm.unraisable.exc_type, cm.unraisable.exc_value, cm.unraisable.exc_traceback, ) ) > warnings.warn(pytest.PytestUnraisableExceptionWarning(msg)) E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function StreamWriter.__del__ at 0xffff878ed620> E E Traceback (most recent call last): E File "/usr/local/lib/python3.11/asyncio/streams.py", line 411, in __del__ E warnings.warn("loop is closed", ResourceWarning) E ResourceWarning: loop is closed ../virtualenvs/project-bTydf30B-py3.11/lib/python3.11/site-packages/_pytest/unraisableexception.py:78: PytestUnraisableExceptionWarningIs it expected? Should I add those warnings as ignored to my
pytestsetup?@mdczaplicki That error might be due to pytest -- I cannot tell from the output you're posting. If you really think this is still not fixed in CPython 3.11.9, can you open a new issue with complete instructions for reproducing the problem? (Ideally also testing in 3.12.)
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Bug report
Bug description:
PR #107650 added a
StreamWriter.__del__that emits a ResourceWarning if a StreamWriter is not closed by the time it is garbage collected, and it has been backported as 3.11.5. However, if the event loop has already been closed by the time this happens, it causes a RuntimeError message to be displayed. It's non-fatal because exceptions raised by__del__are ignored, but it causes an error message to be displayed to the user (as opposed to ResourceWarning, which is only shown when one opts in).Code like the following used to run without any visible error, but now prints a traceback (and does not report the ResourceWarning for the unclosed StreamWriter when run with
-X dev):Output in 3.11.5:
CPython versions tested on:
3.11
Operating systems tested on:
Linux
Linked PRs