refactor: coalesce progress edit wakeups (#17)

This commit is contained in:
banteg
2026-01-01 23:46:48 +04:00
committed by GitHub
parent 12dfaded26
commit 4aa7b74790
+18 -13
View File
@@ -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)