Не удается выйти из асинхронного процесса - PullRequest
0 голосов
/ 26 августа 2018

У меня проблема с выходом из асинхронного процесса, который обрабатывается 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: Невозможно закрыть работающий цикл событий

Я будублагодарен за помощь и заранее благодарим вас!

...