All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Richard W.M. Jones" <rjones@redhat.com>
To: "Miro Hrončok" <mhroncok@redhat.com>
Cc: jsnow@redhat.com, crosa@redhat.com, qemu-devel@nongnu.org,
	berrange@redhat.com
Subject: Re: [PATCH] python: Replace asyncio.get_event_loop for Python 3.14
Date: Tue, 15 Jul 2025 11:56:30 +0100	[thread overview]
Message-ID: <20250715105630.GP7658@redhat.com> (raw)
In-Reply-To: <81d639a0-aea2-495a-91d4-6dcc397ef7db@redhat.com>

On Tue, Jul 15, 2025 at 12:54:26PM +0200, Miro Hrončok wrote:
> On 15. 07. 25 12:51, Richard W.M. Jones wrote:
> >In Python 3.14, no asyncio event loop gets generated automatically.
> >Instead create one when we need it.  This should work with Python 3.13
> >as well.  This is a mechanical change as suggested here:
> >
> >https://bugzilla.redhat.com/show_bug.cgi?id=2375004#c4
> >
> >See-also: https://docs.python.org/3.14/whatsnew/3.14.html#id7
> >Thanks: Miro Hrončok
> >Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
> >---
> >  python/qemu/qmp/legacy.py  | 5 ++++-
> >  python/qemu/qmp/qmp_tui.py | 5 ++++-
> >  python/qemu/qmp/util.py    | 5 ++++-
> >  python/tests/protocol.py   | 5 ++++-
> >  4 files changed, 16 insertions(+), 4 deletions(-)
> >
> >diff --git a/python/qemu/qmp/legacy.py b/python/qemu/qmp/legacy.py
> >index 22a2b5616e..e11d05afbd 100644
> >--- a/python/qemu/qmp/legacy.py
> >+++ b/python/qemu/qmp/legacy.py
> >@@ -86,7 +86,10 @@ def __init__(self,
> >                  "server argument should be False when passing a socket")
> >          self._qmp = QMPClient(nickname)
> >-        self._aloop = asyncio.get_event_loop()
> >+        try:
> >+            self._aloop = asyncio.get_event_loop()
> >+        except RuntimeError:
> >+            self._aloop = asyncio.new_event_loop()
> >          self._address = address
> >          self._timeout: Optional[float] = None
> >diff --git a/python/qemu/qmp/qmp_tui.py b/python/qemu/qmp/qmp_tui.py
> >index 2d9ebbd20b..84c5da4e66 100644
> >--- a/python/qemu/qmp/qmp_tui.py
> >+++ b/python/qemu/qmp/qmp_tui.py
> >@@ -377,7 +377,10 @@ def run(self, debug: bool = False) -> None:
> >          screen = urwid.raw_display.Screen()
> >          screen.set_terminal_properties(256)
> >-        self.aloop = asyncio.get_event_loop()
> >+        try:
> >+            self.aloop = asyncio.get_event_loop()
> >+        except RuntimeError:
> >+            self.aloop = asyncio.new_event_loop()
> >          self.aloop.set_debug(debug)
> >          # Gracefully handle SIGTERM and SIGINT signals
> >diff --git a/python/qemu/qmp/util.py b/python/qemu/qmp/util.py
> >index ca6225e9cd..8f9f849a5f 100644
> >--- a/python/qemu/qmp/util.py
> >+++ b/python/qemu/qmp/util.py
> >@@ -160,7 +160,10 @@ def asyncio_run(coro: Coroutine[Any, Any, T], *, debug: bool = False) -> T:
> >          return asyncio.run(coro, debug=debug)
> >      # Python 3.6
> >-    loop = asyncio.get_event_loop()
> >+    try:
> >+        loop = asyncio.get_event_loop()
> >+    except RuntimeError:
> >+        loop = asyncio.new_event_loop()
> >      loop.set_debug(debug)
> >      ret = loop.run_until_complete(coro)
> >      loop.close()
> 
> This one particular addition should not be necessary as it only runs
> on Python 3.6. This code is not reached on Python 3.7+ and hence it
> is not reached on Python 3.14.

Yup, even says it in the comment :-)

I'll submit a v2 in a little while, in case there is any other feedback.

Rich.

> >diff --git a/python/tests/protocol.py b/python/tests/protocol.py
> >index 56c4d441f9..aa7c0e4397 100644
> >--- a/python/tests/protocol.py
> >+++ b/python/tests/protocol.py
> >@@ -228,7 +228,10 @@ def async_test(async_test_method):
> >          Decorator; adds SetUp and TearDown to async tests.
> >          """
> >          async def _wrapper(self, *args, **kwargs):
> >-            loop = asyncio.get_event_loop()
> >+            try:
> >+                loop = asyncio.get_event_loop()
> >+            except RuntimeError:
> >+                loop = asyncio.new_event_loop()
> >              loop.set_debug(True)
> >              await self._asyncSetUp()
> 
> -- 
> Miro Hrončok
> -- 
> Phone: +420777974800
> Fedora Matrix: mhroncok

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW



  reply	other threads:[~2025-07-15 10:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-15 10:51 [PATCH] python: Replace asyncio.get_event_loop for Python 3.14 Richard W.M. Jones
2025-07-15 10:54 ` Miro Hrončok
2025-07-15 10:56   ` Richard W.M. Jones [this message]
2025-07-15 11:19 ` Daniel P. Berrangé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250715105630.GP7658@redhat.com \
    --to=rjones@redhat.com \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=mhroncok@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.