The waiters in arrival order.
Functions#
__init__#
__init__() -> Nonedef __init__(self) -> None:
self._line: dict[Waiter, None] = {}park#
park(waiter, resume) -> NoneSleep until woken. A waiter already in line keeps its place.
| Parameter | Type | Description |
|---|---|---|
waiter | Waiter | |
resume | Resume |
def park(self, waiter: Waiter, resume: Resume) -> None:
"""Sleep until woken. A waiter already in line keeps its place."""
waiter.resume = resume
self._line[waiter] = Nonecancel#
cancel(waiter) -> NoneThe waiter was interrupted. Asleep, it leaves at once, so no wake is spent on it; once woken, it stays until it passes the wake on.
| Parameter | Type | Description |
|---|---|---|
waiter | Waiter |
def cancel(self, waiter: Waiter) -> None:
"""The waiter was interrupted. Asleep, it leaves at once, so no wake
is spent on it; once woken, it stays until it passes the wake on."""
if waiter.is_sleeping:
waiter.resume = None
del self._line[waiter]leave#
leave(waiter) -> boolTake waiter out of line; whether it was in it.
| Parameter | Type | Description |
|---|---|---|
waiter | Waiter |
Returns bool
def leave(self, waiter: Waiter) -> bool:
"""Take ``waiter`` out of line; whether it was in it."""
if waiter not in self._line:
return False
del self._line[waiter]
return Truefirst_sleeping#
first_sleeping() -> Waiter | NoneReturns Waiter | None
def first_sleeping(self) -> Waiter | None:
return next((w for w in self._line if w.is_sleeping), None)wake#
wake(scheduler, count, available) -> NoneWake up to count sleeping waiters, in order, while
available() holds.
| Parameter | Type | Description |
|---|---|---|
scheduler | Scheduler | |
count | int | |
available | Callable[[], bool] |
def wake(self, scheduler: Scheduler, count: int, available: Callable[[], bool]) -> None:
"""Wake up to ``count`` sleeping waiters, in order, while
``available()`` holds."""
if not self._line:
return
def wake(remaining: int) -> None:
waiter = self.first_sleeping() if available() else None
if waiter is None:
return
waiter()
if remaining > 1:
scheduler.schedule(lambda: wake(remaining - 1))
scheduler.schedule(lambda: wake(count))wake_all#
wake_all(scheduler) -> NoneWake everyone in line now to retry.
| Parameter | Type | Description |
|---|---|---|
scheduler | Scheduler |
def wake_all(self, scheduler: Scheduler) -> None:
"""Wake everyone in line now to retry."""
waiters = list(self._line)
if not waiters:
return
def wake(index: int) -> None:
waiters[index]()
if index + 1 < len(waiters):
scheduler.schedule(lambda: wake(index + 1))
scheduler.schedule(lambda: wake(0))release_all#
release_all() -> NoneEmpty the line, waking everyone at once (the pool shuts down).
def release_all(self) -> None:
"""Empty the line, waking everyone at once (the pool shuts down)."""
waiters = list(self._line)
self._line.clear()
for waiter in waiters:
waiter()