【发布时间】:2018-11-13 08:51:35
【问题描述】:
我有一个实现请求/回复事务的等待对象。如果事务超时,它会在放弃并引发异常之前重试几次。
现在假设它总是超时,因为这是我遇到问题的情况。
当任务开始此操作然后被取消时,重试将继续。这不是我想要的。我想完全取消操作。
我准备了一个 MCVE 并注意到,当任务被取消时,任务正在等待的未来会被取消。这很适合我,它可以作为解决方案的基础,但我不明白为什么那个未来会被取消,我是否可以依赖它。
import asyncio
RETRIES = 2
TIMEOUT = 1.0
class ClientRPC:
def __init__(self):
self._reply = None
self._retries = RETRIES
def __await__(self):
self.start()
return self._reply.__await__()
def start(self):
loop = asyncio.get_event_loop()
if self._reply is None:
self._reply = loop.create_future()
loop.call_later(TIMEOUT, self.handle_timeout)
# send a request
print("REQUEST")
def handle_timeout(self):
print("TIMEOUT")
print("future", repr(self._reply._state))
if self._retries > 0:
self._retries -= 1
self.start()
else:
self._reply.set_exception(RuntimeError("Timeout!"))
def handle_reply(self, reply):
# unused in this example
pass
async def client():
transaction = ClientRPC()
try:
reply = await transaction
except asyncio.CancelledError:
print("--CANCELLED--")
async def test():
loop = asyncio.get_event_loop()
task = loop.create_task(client())
await asyncio.sleep(1.5)
task.cancel()
await asyncio.sleep(3)
asyncio.run(test()) # python 3.7+
输出(省略回溯):
要求 超时 未来的“待定” 要求 - 取消 - 超时 未来“取消”【问题讨论】:
标签: python python-asyncio