Q:

Асинхронное переподключение к серверу

Есть два python-скрипта простенького мессенджера, сервер и клиент, ниже листинг клиента.
Суть проблемы заключается в обработке поведения кнопки в функции reconnect_button. При нажатии, я отключаюсь от сервера и пытаюсь снова к нему подключиться, вызывая self.start(), но при нажатии на кнопку, в Traceback выводится: RuntimeWarning: coroutine 'MainWindow.start' was never awaited. Как мне вклиниться в поток, чтобы выдать ему указание снова подключиться? Приостановить весь поток?
app.py
import asyncio
from asyncio import transports
from PySide2.QtWidgets import QMainWindow, QApplication
from asyncqt import QEventLoop
from interface import Ui_MainWindow

class ClientProtocol(asyncio.Protocol):
    transport: transports.Transport
    window: 'MainWindow'

    def __init__(self, chat_window: 'MainWindow'):
        self.window = chat_window

    def data_received(self, data: bytes):
        decoded = data.decode()
        self.window.append_text(decoded)

    def send_data(self, message: str):
        encoded = message.encode()
        self.transport.write(encoded)

    def connection_made(self, transport: transports.BaseTransport):
        self.window.append_text("Connected")
        self.transport = transport

    def connection_lost(self, exception):
        self.window.append_text("Disconnected")

class MainWindow(QMainWindow, Ui_MainWindow):
    protocol: ClientProtocol
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.message_button.clicked.connect(self.messagebutton_handler)
        self.reconnect_button.clicked.connect(self.reconnect_handler)

    def messagebutton_handler(self):
        message_text = self.message_input.text()
        self.message_input.clear()
        self.protocol.send_data(message_text)

    def reconnect_handler(self):
        self.message_box.clear()
        self.protocol.transport.close()
        self.start()

    def append_text(self, content: str):
        self.message_box.appendPlainText(content)

    def build_protocol(self):
        self.protocol = ClientProtocol(self)
        return self.protocol

    async def start(self):
        event_loop = asyncio.get_running_loop()
        coroutine = event_loop.create_connection(
            self.build_protocol,
            "127.0.0.1",
            8888
        )
        await asyncio.wait_for(coroutine, 1000)

app = QApplication()
loop = QEventLoop(app)
asyncio.set_event_loop(loop)
window = MainWindow()
loop.create_task(window.start())
window.show()
loop.run_forever()

A:

def reconnect_handler(self):
    self.message_box.clear()
    self.protocol.transport.close()
    asyncio.ensure_future(self.start())

или 
    loop.create_task(self.start())

Асинхронную функцию нужно запланировать к выполнению - поставить на loop, если она вызывается из синхронного кода.

