File tree Expand file tree Collapse file tree 2 files changed +78
-0
lines changed Expand file tree Collapse file tree 2 files changed +78
-0
lines changed Original file line number Diff line number Diff line change 23
23
"Event" : "event" ,
24
24
"ThreadSafeFlag" : "event" ,
25
25
"Lock" : "lock" ,
26
+ "Queue" : "queue" ,
26
27
"open_connection" : "stream" ,
27
28
"start_server" : "stream" ,
28
29
"StreamReader" : "stream" ,
Original file line number Diff line number Diff line change
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 ()
You can’t perform that action at this time.
0 commit comments