Skip to content

Commit 99b2808

Browse files
committed
feat: add queue support
1 parent c277db5 commit 99b2808

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

asyncio/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"Event": "event",
2424
"ThreadSafeFlag": "event",
2525
"Lock": "lock",
26+
"Queue": "queue",
2627
"open_connection": "stream",
2728
"start_server": "stream",
2829
"StreamReader": "stream",

asyncio/queue.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from . import event
2+
3+
4+
class QueueEmpty(Exception):
5+
pass
6+
7+
8+
class QueueFull(Exception):
9+
pass
10+
11+
12+
class Queue:
13+
def __init__(self, maxsize=0):
14+
self.maxsize = maxsize
15+
self._queue = list()
16+
17+
self._join_counter = 0
18+
self._join_event = event.Event()
19+
self._join_event.set()
20+
21+
self._put_event = event.Event()
22+
self._get_event = event.Event()
23+
24+
def _get(self):
25+
value = self._queue.pop(0)
26+
self._get_event.set()
27+
self._get_event.clear()
28+
return value
29+
30+
def _put(self, val):
31+
self._join_counter += 1
32+
self._join_event.clear()
33+
34+
self._queue.append(val)
35+
36+
self._put_event.set()
37+
self._put_event.clear()
38+
39+
async def get(self):
40+
while self.empty():
41+
await self._put_event.wait()
42+
return self._get()
43+
44+
def get_nowait(self):
45+
if self.empty():
46+
raise QueueEmpty()
47+
return self._get()
48+
49+
async def put(self, val):
50+
while self.full():
51+
await self._get_event.wait()
52+
self._put(val)
53+
54+
def put_nowait(self, val):
55+
if self.full():
56+
raise QueueFull()
57+
self._put(val)
58+
59+
def qsize(self):
60+
return len(self._queue)
61+
62+
def empty(self):
63+
return len(self._queue) == 0
64+
65+
def full(self):
66+
return 0 < self.maxsize <= self.qsize()
67+
68+
def task_done(self):
69+
self._join_counter -= 1
70+
71+
if self._join_counter <= 0:
72+
# Can't have less than 0
73+
self._join_counter = 0
74+
self._join_event.set()
75+
76+
async def join(self):
77+
await self._join_event.wait()

0 commit comments

Comments
 (0)