Есть несколько предложений, которые я могу сделать, и, надеюсь, это решит ваши проблемы.
Не используйте реактор.callFromThread, вместо этого используйте deferToThread
from twisted.internet.threads import deferToThread
deferredObj = threads.deferToThread(run_app, self.appDataReceived)
Точно так же, как вы запускаете поток, когда соединение установлено. Вы должны действовать, когда соединение потеряно.
Пример кода:
class Echo(Protocol):
def connectionLost(self, reason):
print reason
# which is crude, there should be a more elegant answer
reactor.stop()
Согласился, что deferToThread оптимизирован для краткосрочных задач. На самом деле, лучше сделать код заново, чтобы вы могли вызвать поток, чтобы просто запустить процесс и вернуть результат.