如何使协程停止超时?
我不明白为什么 asyncio.wait_for() 对我不起作用。我有这样一段代码(计划实现我的 telnet 客户端):
def expect(self, pattern, timeout=20):
if type(pattern) == str:
pattern = pattern.encode('ascii', 'ignore')
return self.loop.run_until_complete(asyncio.wait_for(self.asyncxpect(pattern), timeout))
async def asyncxpect(self, pattern): #receives data in a cumulative way until match is found
regexp = re.compile(b'(?P<payload>[\s\S]*)(?P<pattern>%s)' %pattern)
self.buffer = b''
while True:
# add timeout
# add exception handling for unexpectedly closed connections
data = await self.loop.sock_recv(self.sock, 10000)
self.buffer += data
m = re.match(regexp, self.buffer)
if m:
payload = m.group('payload')
match = m.group('pattern')
return payload, match
正如我所认为的这段代码,在某些时候(在等待语句中)将控制权返回给事件循环。我认为当没有更多数据要接收时应该发生这种情况。如果事件循环有控制权,它可以超时停止。
但是如果服务器没有发送任何有用的(匹配的)我的代码就会在这个循环中绊倒,就在等待点。
我认为它与Python asyncio force timeout这个问题不同,因为我没有使用像 time.sleep(n) 这样的阻塞语句。