コルーチンのタイムアウトをどのようにして停止できますか?Pythonコルーチンのタイムアウト
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
私は(待つ文で)いくつかの点で、このコードを思ったようにはイベントループに制御を返します。私は受け取るべきデータがなくなったらそれが起こるべきだと思った。 イベントループに制御がある場合、タイムアウトで停止することがあります。
しかし、サーバが有用なもの(一致したもの)を送信しなければ、私のコードは待ち時間のちょうどこのループに入り込みます。
私はtime.sleep(n)のようなブロッキングステートメントを使用していないので、この問題Python asyncio force timeoutとは異なると思います。サーバは、ファイルの終わりを示す、空のByteArray(b''
)を返しsock_recv
接続を閉じ
私はtime.sleep(n)のようなブロッキングステートメントを使用していないので、この問題 "Python asyncio force timeout"とは異なると思います。 –
コメントで示されているように、これは実際には非同期関数でブロッキングコールを使用する問題である他の質問とはかなり異なっています。詳細は私の答えを見てください。 – user4815162342