From 1b19b6db13f13bffb7ad2b9a63618639f51606ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Cruz?= Date: Mon, 9 Jan 2023 06:29:23 +0000 Subject: [PATCH] Prevent race condition in example code (#305) The example async server code uses timeouts around read() operations. However, this has a race condition where data can be read, the timeout fires, and the data is lost. These timeouts are not really needed in this example code, so I removed them to prevent people from having strange issues with lost messages and undefined RPC behavior when using the example code. --- docs/quickstart.rst | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index b5d5632..132d22b 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -550,35 +550,21 @@ To simplify the callbacks use a server class to define the reader/writer callbac class Server: async def myreader(self): - while self.retry: + while self.retry and not self.reader.at_eof(): try: - # Must be a wait_for so we don't block on read() - data = await asyncio.wait_for( - self.reader.read(4096), - timeout=0.1 - ) - except asyncio.TimeoutError: - print("myreader timeout.") - continue + data = await self.reader.read(4096) + await self.server.write(data) except Exception as err: print("Unknown myreader err: %s", err) return False - await self.server.write(data) print("myreader done.") return True async def mywriter(self): while self.retry: try: - # Must be a wait_for so we don't block on read() - data = await asyncio.wait_for( - self.server.read(4096), - timeout=0.1 - ) + data = await self.server.read(4096) self.writer.write(data.tobytes()) - except asyncio.TimeoutError: - print("mywriter timeout.") - continue except Exception as err: print("Unknown mywriter err: %s", err) return False