Witajcie
Od pewnego czasu mam problem z wyjściem z programu, który wykorzystuje bibliotekę asyncio
. Pomysł jest prosty - chcę, aby program klienta został wyłączony po tym jak wyśle do serwera komendę exit
. Napisałem już post na StackOverflow - https://stackoverflow.com/questions/52027965/cant-exit-asynchronous-process?noredirect=1#comment91008669_52027965, ale nie uzyskałem żadnej sensownej odpowiedzi do tej pory. Zastosowałem się do komentarze i poprawiłem kod, ale to sprawia, że przy wyłączeniu jednego procesu, kolejny proces, który włączam nie może pobrać żadnych danych z socketu od klienta. Czy ktoś wie w jaki sposób mógłbym wyjść z procesu?
Oto kod klas, które są najważniejsze do wyłapania błędu:
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()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
FTP_connection = FtpConnection(loop)
task = loop.create_task(FTP_connection.connect())
loop.run_forever()
Myślę, że problem może polegać na tym, że występuje tutaj ta instrukcja:
loop.run_forever()
Czy ktoś byłby w stanie mi pomóc? Będę bardzo wdzięczny, tym bardziej, że zupełnie nie wiem jak ten problem rozwiązać, a rzadko się zdarza, że mam taką pustkę w głowię.