refactor: coalesce progress edit wakeups (#17)
This commit is contained in:
+18
-13
@@ -127,20 +127,20 @@ class ProgressEdits:
|
|||||||
self.last_edit_at = last_edit_at
|
self.last_edit_at = last_edit_at
|
||||||
self.last_rendered = last_rendered
|
self.last_rendered = last_rendered
|
||||||
self.is_resume_line = is_resume_line
|
self.is_resume_line = is_resume_line
|
||||||
self._event_seq = 0
|
self.event_seq = 0
|
||||||
self._published_seq = 0
|
self.rendered_seq = 0
|
||||||
self.wakeup = anyio.Event()
|
self.signal_send, self.signal_recv = anyio.create_memory_object_stream(1)
|
||||||
|
|
||||||
async def _wait_for_wakeup(self) -> None:
|
|
||||||
await self.wakeup.wait()
|
|
||||||
self.wakeup = anyio.Event()
|
|
||||||
|
|
||||||
async def run(self) -> None:
|
async def run(self) -> None:
|
||||||
if self.progress_id is None:
|
if self.progress_id is None:
|
||||||
return
|
return
|
||||||
while True:
|
while True:
|
||||||
await self._wait_for_wakeup()
|
while self.rendered_seq == self.event_seq:
|
||||||
while self._published_seq < self._event_seq:
|
try:
|
||||||
|
await self.signal_recv.receive()
|
||||||
|
except anyio.EndOfStream:
|
||||||
|
return
|
||||||
|
|
||||||
await self.sleep(
|
await self.sleep(
|
||||||
max(
|
max(
|
||||||
0.0,
|
0.0,
|
||||||
@@ -148,7 +148,7 @@ class ProgressEdits:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
seq_at_render = self._event_seq
|
seq_at_render = self.event_seq
|
||||||
now = self.clock()
|
now = self.clock()
|
||||||
md = self.renderer.render_progress(now - self.started_at)
|
md = self.renderer.render_progress(now - self.started_at)
|
||||||
rendered, entities = prepare_telegram(
|
rendered, entities = prepare_telegram(
|
||||||
@@ -168,15 +168,20 @@ class ProgressEdits:
|
|||||||
if edited is not None:
|
if edited is not None:
|
||||||
self.last_rendered = rendered
|
self.last_rendered = rendered
|
||||||
|
|
||||||
self._published_seq = seq_at_render
|
self.rendered_seq = seq_at_render
|
||||||
|
|
||||||
async def on_event(self, evt: TakopiEvent) -> None:
|
async def on_event(self, evt: TakopiEvent) -> None:
|
||||||
if not self.renderer.note_event(evt):
|
if not self.renderer.note_event(evt):
|
||||||
return
|
return
|
||||||
if self.progress_id is None:
|
if self.progress_id is None:
|
||||||
return
|
return
|
||||||
self._event_seq += 1
|
self.event_seq += 1
|
||||||
self.wakeup.set()
|
try:
|
||||||
|
self.signal_send.send_nowait(None)
|
||||||
|
except anyio.WouldBlock:
|
||||||
|
pass
|
||||||
|
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user