У меня проблема с выходом из асинхронного процесса, который обрабатывается asyncio.Это проект ftp server + client, и я хочу завершить клиентский процесс после команды exit .
Самая важная часть этого кода находится здесь:
class FtpCommandsReceiver:
def __init__(self, loop, sock):
self.loop = loop
self.sock = sock
self.loop.create_task(self.recieve_data())
self.commands_to_handle = {
'exit': self.exit_handler
}
async def recieve_data(self):
while True:
self.data_to_send = input('ftp> ')
if self.data_to_send == '':
continue
await self.loop.sock_sendall(self.sock, self.data_to_send.encode())
try:
await self.commands_to_handle.get(self.data_to_send)()
except TypeError:
pass
self.received_data = await self.loop.sock_recv(self.sock, 10000)
print(self.received_data.decode())
if not self.received_data:
break
print('Connection closed by the server')
self.sock.close()
async def exit_handler(self):
self.loop.stop()
self.loop.close()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
FTP_connection = FtpConnection(loop)
task = loop.create_task(FTP_connection.connect())
try:
loop.run_forever()
finally:
loop.close()
Когда вызывается метод exit_handler , возникает исключение:
Исключение задачи не было получено
future: exception = RuntimeError ('Не удалось закрыть работающий цикл событий',)> Traceback (последний вызов был последним):
Файл "/usr/lib/python3.5/asyncio/tasks.py", строка 239, в _step result = coro.send (None)
File "FTPclient.py ", строка 54, в recieve_data ожидают self.commands_to_handle.get (self.data_to_send) ()
Файл" FTPclient.py ", строка 66, в exit_handler self.loop.close ()
Файл"/usr/lib/python3.5/asyncio/unix_events.py ", строка 56, в close super (). close ()
Файл" /usr/lib/python3.5/asyncio/selector_events.py ", строка94, в закрытом режиме RuntimeError («Невозможно закрыть работающий цикл событий»)
RuntimeError: Невозможно закрыть работающий цикл событий
Я будублагодарен за помощь и заранее благодарим вас!