[gnome-music/wip/mschraal/asyncqueue-rework: 1/2] asynqueue: Move async callback to a regular function
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/mschraal/asyncqueue-rework: 1/2] asynqueue: Move async callback to a regular function
- Date: Sun, 26 Sep 2021 10:16:00 +0000 (UTC)
commit f733bdfec8a30ea97a7ffa62eee8e075a3256e2d
Author: Marinus Schraal <mschraal gnome org>
Date: Sun Sep 26 11:58:51 2021 +0200
asynqueue: Move async callback to a regular function
The async callback was an inner function, split it out to a regular
function to accomodate future changes. Pass the data which was
previously in scope via a dict.
gnomemusic/asyncqueue.py | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
---
diff --git a/gnomemusic/asyncqueue.py b/gnomemusic/asyncqueue.py
index 84b0eb379..7d8ca47dd 100644
--- a/gnomemusic/asyncqueue.py
+++ b/gnomemusic/asyncqueue.py
@@ -56,6 +56,7 @@ class AsyncQueue(GObject.GObject):
self._async_pool: Dict[int, Tuple] = {}
self._async_active_pool: Dict[int, Tuple] = {}
+ self._async_data: Dict[object, Tuple[int, float]] = {}
self._log = MusicLogger()
self._max_async = 4
self._queue_name = queue_name if queue_name else self
@@ -79,21 +80,8 @@ class AsyncQueue(GObject.GObject):
self._timeout_id = GLib.timeout_add(100, self._dispatch)
def _dispatch(self) -> bool:
- result_id = 0
tick = time.time()
- def on_async_finished(obj, *signal_args):
- t = (time.time() - tick) * 1000
- self._log.debug(f"{self._queue_name}: {t:.2f} ms task")
-
- a = len(self._async_active_pool)
- self._log.debug(
- f"{self._queue_name}: "
- f"{a} active task(s) of {len(self._async_pool) + a}")
-
- obj.disconnect(result_id)
- self._async_active_pool.pop(id(obj))
-
if len(self._async_pool) == 0:
self._timeout_id = 0
return GLib.SOURCE_REMOVE
@@ -103,7 +91,23 @@ class AsyncQueue(GObject.GObject):
async_obj = async_task_args[0]
self._async_active_pool[async_obj_id] = async_task_args
- result_id = async_obj.connect("finished", on_async_finished)
+ self._async_data[async_obj] = (
+ async_obj.connect("finished", self._on_async_finished),
+ tick)
async_obj.start(*async_task_args[1:])
return GLib.SOURCE_CONTINUE
+
+ def _on_async_finished(
+ self, obj: Any, *signal_args: Any) -> None:
+ handler_id, tick = self._async_data.pop(obj)
+ t = (time.time() - tick) * 1000
+ self._log.debug(f"{self._queue_name}: {t:.2f} ms task")
+
+ a = len(self._async_active_pool)
+ self._log.debug(
+ f"{self._queue_name}: "
+ f"{a} active task(s) of {len(self._async_pool) + a}")
+
+ obj.disconnect(handler_id)
+ self._async_active_pool.pop(id(obj))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]