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.
This commit is contained in:
@@ -550,35 +550,21 @@ To simplify the callbacks use a server class to define the reader/writer callbac
|
|||||||
|
|
||||||
class Server:
|
class Server:
|
||||||
async def myreader(self):
|
async def myreader(self):
|
||||||
while self.retry:
|
while self.retry and not self.reader.at_eof():
|
||||||
try:
|
try:
|
||||||
# Must be a wait_for so we don't block on read()
|
data = await self.reader.read(4096)
|
||||||
data = await asyncio.wait_for(
|
await self.server.write(data)
|
||||||
self.reader.read(4096),
|
|
||||||
timeout=0.1
|
|
||||||
)
|
|
||||||
except asyncio.TimeoutError:
|
|
||||||
print("myreader timeout.")
|
|
||||||
continue
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print("Unknown myreader err: %s", err)
|
print("Unknown myreader err: %s", err)
|
||||||
return False
|
return False
|
||||||
await self.server.write(data)
|
|
||||||
print("myreader done.")
|
print("myreader done.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def mywriter(self):
|
async def mywriter(self):
|
||||||
while self.retry:
|
while self.retry:
|
||||||
try:
|
try:
|
||||||
# Must be a wait_for so we don't block on read()
|
data = await self.server.read(4096)
|
||||||
data = await asyncio.wait_for(
|
|
||||||
self.server.read(4096),
|
|
||||||
timeout=0.1
|
|
||||||
)
|
|
||||||
self.writer.write(data.tobytes())
|
self.writer.write(data.tobytes())
|
||||||
except asyncio.TimeoutError:
|
|
||||||
print("mywriter timeout.")
|
|
||||||
continue
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print("Unknown mywriter err: %s", err)
|
print("Unknown mywriter err: %s", err)
|
||||||
return False
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user