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_rendered = last_rendered
self.is_resume_line = is_resume_line
self._event_seq = 0
self._published_seq = 0
self.wakeup = anyio.Event()
async def _wait_for_wakeup(self) -> None:
await self.wakeup.wait()
self.wakeup = anyio.Event()
self.event_seq = 0
self.rendered_seq = 0
self.signal_send, self.signal_recv = anyio.create_memory_object_stream(1)
async def run(self) -> None:
if self.progress_id is None:
return
while True:
await self._wait_for_wakeup()
while self._published_seq < self._event_seq:
while self.rendered_seq == self.event_seq:
try:
await self.signal_recv.receive()
except anyio.EndOfStream:
return
await self.sleep(
max(
0.0,
@@ -148,7 +148,7 @@ class ProgressEdits:
)
)
seq_at_render = self._event_seq
seq_at_render = self.event_seq
now = self.clock()
md = self.renderer.render_progress(now - self.started_at)
rendered, entities = prepare_telegram(
@@ -168,15 +168,20 @@ class ProgressEdits:
if edited is not None:
self.last_rendered = rendered
self._published_seq = seq_at_render
self.rendered_seq = seq_at_render
async def on_event(self, evt: TakopiEvent) -> None:
if not self.renderer.note_event(evt):
return
if self.progress_id is None:
return
self._event_seq += 1
self.wakeup.set()
self.event_seq += 1
try:
self.signal_send.send_nowait(None)
except anyio.WouldBlock:
pass
except (anyio.BrokenResourceError, anyio.ClosedResourceError):
pass
@dataclass(frozen=True)