Skip to content

Commit 49a6446

Browse files
committed
core/select: add {Select,Latch,Receiver}.size(), deprecate empty()
Knowing an estimate of the buffered items is needed for adding a latch/receiver with many existing buffered items via Select.add().
1 parent 95b067a commit 49a6446

File tree

2 files changed

+65
-25
lines changed

2 files changed

+65
-25
lines changed

mitogen/core.py

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,13 +1095,32 @@ def close(self):
10951095
self.handle = None
10961096
self._latch.close()
10971097

1098+
def size(self):
1099+
"""
1100+
Return the number of items currently buffered.
1101+
1102+
As with :class:`Queue.Queue`, `0` may be returned even though a
1103+
subsequent call to :meth:`get` will succeed, since a message may be
1104+
posted at any moment between :meth:`size` and :meth:`get`.
1105+
1106+
As with :class:`Queue.Queue`, `>0` may be returned even though a
1107+
subsequent call to :meth:`get` will block, since another waiting thread
1108+
may be woken at any moment between :meth:`size` and :meth:`get`.
1109+
1110+
:raises LatchError:
1111+
The underlying latch has already been marked closed.
1112+
"""
1113+
return self._latch.size()
1114+
10981115
def empty(self):
10991116
"""
1100-
Return :data:`True` if calling :meth:`get` would block.
1117+
Return `size() == 0`.
1118+
1119+
.. deprecated:: 0.2.8
1120+
Use :meth:`size` instead.
11011121
1102-
As with :class:`Queue.Queue`, :data:`True` may be returned even though
1103-
a subsequent call to :meth:`get` will succeed, since a message may be
1104-
posted at any moment between :meth:`empty` and :meth:`get`.
1122+
:raises LatchError:
1123+
The latch has already been marked closed.
11051124
"""
11061125
return self._latch.empty()
11071126

@@ -1150,7 +1169,10 @@ class Channel(Sender, Receiver):
11501169
A channel inherits from :class:`mitogen.core.Sender` and
11511170
`mitogen.core.Receiver` to provide bidirectional functionality.
11521171
1153-
This class is incomplete and obsolete, it will be removed in Mitogen 0.3.
1172+
.. deprecated:: 0.2.0
1173+
This class is incomplete and obsolete, it will be removed in Mitogen
1174+
0.3.
1175+
11541176
Channels were an early attempt at syntax sugar. It is always easier to pass
11551177
around unidirectional pairs of senders/receivers, even though the syntax is
11561178
baroque:
@@ -2385,19 +2407,17 @@ def close(self):
23852407
finally:
23862408
self._lock.release()
23872409

2388-
def empty(self):
2410+
def size(self):
23892411
"""
2390-
Return :data:`True` if calling :meth:`get` would block.
2412+
Return the number of items currently buffered.
23912413
2392-
As with :class:`Queue.Queue`, :data:`True` may be returned even
2393-
though a subsequent call to :meth:`get` will succeed, since a
2394-
message may be posted at any moment between :meth:`empty` and
2395-
:meth:`get`.
2414+
As with :class:`Queue.Queue`, `0` may be returned even though a
2415+
subsequent call to :meth:`get` will succeed, since a message may be
2416+
posted at any moment between :meth:`size` and :meth:`get`.
23962417
2397-
As with :class:`Queue.Queue`, :data:`False` may be returned even
2398-
though a subsequent call to :meth:`get` will block, since another
2399-
waiting thread may be woken at any moment between :meth:`empty` and
2400-
:meth:`get`.
2418+
As with :class:`Queue.Queue`, `>0` may be returned even though a
2419+
subsequent call to :meth:`get` will block, since another waiting thread
2420+
may be woken at any moment between :meth:`size` and :meth:`get`.
24012421
24022422
:raises LatchError:
24032423
The latch has already been marked closed.
@@ -2406,10 +2426,22 @@ def empty(self):
24062426
try:
24072427
if self.closed:
24082428
raise LatchError()
2409-
return len(self._queue) == 0
2429+
return len(self._queue)
24102430
finally:
24112431
self._lock.release()
24122432

2433+
def empty(self):
2434+
"""
2435+
Return `size() == 0`.
2436+
2437+
.. deprecated:: 0.2.8
2438+
Use :meth:`size` instead.
2439+
2440+
:raises LatchError:
2441+
The latch has already been marked closed.
2442+
"""
2443+
return self.size() == 0
2444+
24132445
def _get_socketpair(self):
24142446
"""
24152447
Return an unused socketpair, creating one if none exist.

mitogen/select.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -259,18 +259,26 @@ def close(self):
259259
self.remove(recv)
260260
self._latch.close()
261261

262-
def empty(self):
262+
def size(self):
263+
"""
264+
Return the number of items currently buffered.
265+
266+
As with :class:`Queue.Queue`, `0` may be returned even though a
267+
subsequent call to :meth:`get` will succeed, since a message may be
268+
posted at any moment between :meth:`size` and :meth:`get`.
269+
270+
As with :class:`Queue.Queue`, `>0` may be returned even though a
271+
subsequent call to :meth:`get` will block, since another waiting thread
272+
may be woken at any moment between :meth:`size` and :meth:`get`.
263273
"""
264-
Return :data:`True` if calling :meth:`get` would block.
274+
return sum(recv.size() for recv in self._receivers)
265275

266-
As with :class:`Queue.Queue`, :data:`True` may be returned even though
267-
a subsequent call to :meth:`get` will succeed, since a message may be
268-
posted at any moment between :meth:`empty` and :meth:`get`.
276+
def empty(self):
277+
"""
278+
Return `size() == 0`.
269279
270-
:meth:`empty` may return :data:`False` even when :meth:`get` would
271-
block if another thread has drained a receiver added to this select.
272-
This can be avoided by only consuming each receiver from a single
273-
thread.
280+
.. deprecated:: 0.2.8
281+
Use :meth:`size` instead.
274282
"""
275283
return self._latch.empty()
276284

0 commit comments

Comments
 (0)