diff options
Diffstat (limited to 'sources/pyside6/PySide6/QtAsyncio/__init__.py')
-rw-r--r-- | sources/pyside6/PySide6/QtAsyncio/__init__.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtAsyncio/__init__.py b/sources/pyside6/PySide6/QtAsyncio/__init__.py new file mode 100644 index 000000000..4baa8134e --- /dev/null +++ b/sources/pyside6/PySide6/QtAsyncio/__init__.py @@ -0,0 +1,60 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +from .events import ( + QAsyncioEventLoopPolicy, QAsyncioEventLoop, QAsyncioHandle, QAsyncioTimerHandle +) +from .futures import QAsyncioFuture +from .tasks import QAsyncioTask + +import asyncio +import typing + +__all__ = [ + "QAsyncioEventLoopPolicy", "QAsyncioEventLoop", + "QAsyncioHandle", "QAsyncioTimerHandle", + "QAsyncioFuture", "QAsyncioTask" +] + + +def run(coro: typing.Optional[typing.Coroutine] = None, + keep_running: bool = True, + quit_qapp: bool = True, *, + handle_sigint: bool = False, + debug: typing.Optional[bool] = None) -> typing.Any: + """Run the QtAsyncio event loop.""" + + # Event loop policies are expected to be deprecated with Python 3.13, with + # subsequent removal in Python 3.15. At that point, part of the current + # logic of the QAsyncioEventLoopPolicy constructor will have to be moved + # here and/or to a loop factory class (to be provided as an argument to + # asyncio.run()), namely setting up the QCoreApplication and the SIGINT + # handler. + # + # More details: + # https://discuss.python.org/t/removing-the-asyncio-policy-system-asyncio-set-event-loop-policy-in-python-3-15/37553 # noqa: E501 + default_policy = asyncio.get_event_loop_policy() + asyncio.set_event_loop_policy( + QAsyncioEventLoopPolicy(quit_qapp=quit_qapp, handle_sigint=handle_sigint)) + + ret = None + exc = None + + if keep_running: + if coro: + asyncio.ensure_future(coro) + asyncio.get_event_loop().run_forever() + else: + if coro: + ret = asyncio.run(coro, debug=debug) + else: + exc = RuntimeError( + "QtAsyncio was set to keep running after the coroutine " + "finished, but no coroutine was provided.") + + asyncio.set_event_loop_policy(default_policy) + + if ret: + return ret + if exc: + raise exc |