From f696d123ae3212507bf742f7abdd2be75c3319c4 Mon Sep 17 00:00:00 2001 From: Matthias Urlichs Date: Wed, 12 Apr 2023 15:31:27 +0200 Subject: [PATCH 1/3] uasyncio.queues: Use taskqueues instead of busy-waiting --- uasyncio.queues/uasyncio/queues.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/uasyncio.queues/uasyncio/queues.py b/uasyncio.queues/uasyncio/queues.py index 04918ae5c1..992466e207 100644 --- a/uasyncio.queues/uasyncio/queues.py +++ b/uasyncio.queues/uasyncio/queues.py @@ -1,5 +1,6 @@ from collections.deque import deque -from uasyncio.core import sleep + +from uasyncio import core class QueueEmpty(Exception): @@ -21,14 +22,18 @@ class Queue: with qsize(), since your single-threaded uasyncio application won't be interrupted between calling qsize() and doing an operation on the Queue. """ - _attempt_delay = 0.1 def __init__(self, maxsize=0): self.maxsize = maxsize self._queue = deque() + self._full = core.TaskQueue() + self._empty = core.TaskQueue() def _get(self): - return self._queue.popleft() + res = self._queue.popleft() + if self._full.peek(): + core._task_queue.push(self._full.pop()) + return res def get(self): """Returns generator, which can be used for getting (and removing) @@ -38,8 +43,11 @@ def get(self): item = yield from queue.get() """ - while not self._queue: - yield from sleep(self._attempt_delay) + if not self._queue: + self._empty.push(core.cur_task) + core.cur_task.data = self._empty + yield + return self._get() def get_nowait(self): @@ -52,6 +60,8 @@ def get_nowait(self): return self._get() def _put(self, val): + if self._empty.peek(): + core._task_queue.push(self._empty.pop()) self._queue.append(val) def put(self, val): @@ -61,8 +71,10 @@ def put(self, val): yield from queue.put(item) """ - while self.qsize() >= self.maxsize and self.maxsize: - yield from sleep(self._attempt_delay) + if self.maxsize and self.qsize() >= self.maxsize: + self._full.push(core.cur_task) + core.cur_task.data = self._full + yield self._put(val) def put_nowait(self, val): From 23be539c9e7ea0057c0b42ee5b836e5e7535dce6 Mon Sep 17 00:00:00 2001 From: Matthias Urlichs Date: Wed, 12 Apr 2023 15:32:02 +0200 Subject: [PATCH 2/3] Don't talk about "yield from" --- uasyncio.queues/uasyncio/queues.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uasyncio.queues/uasyncio/queues.py b/uasyncio.queues/uasyncio/queues.py index 992466e207..7218099d53 100644 --- a/uasyncio.queues/uasyncio/queues.py +++ b/uasyncio.queues/uasyncio/queues.py @@ -41,7 +41,7 @@ def get(self): Usage:: - item = yield from queue.get() + item = await queue.get() """ if not self._queue: self._empty.push(core.cur_task) @@ -69,7 +69,7 @@ def put(self, val): Usage:: - yield from queue.put(item) + await queue.put(item) """ if self.maxsize and self.qsize() >= self.maxsize: self._full.push(core.cur_task) From 67c02ba49857752ccbd5b5f81b9295636544d2bc Mon Sep 17 00:00:00 2001 From: Matthias Urlichs Date: Wed, 12 Apr 2023 15:32:13 +0200 Subject: [PATCH 3/3] Do the easy test first --- uasyncio.queues/uasyncio/queues.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uasyncio.queues/uasyncio/queues.py b/uasyncio.queues/uasyncio/queues.py index 7218099d53..53c20fa7a6 100644 --- a/uasyncio.queues/uasyncio/queues.py +++ b/uasyncio.queues/uasyncio/queues.py @@ -82,7 +82,7 @@ def put_nowait(self, val): If no free slot is immediately available, raise QueueFull. """ - if self.qsize() >= self.maxsize and self.maxsize: + if self.maxsize and self.qsize() >= self.maxsize: raise QueueFull() self._put(val)