Скрученный реактор неправильно вызывает функции из потока

У меня проблемы с twisted.internet.reactor Все мои клиенты имеют полностью идентичные среды, но только у некоторых возникает эта проблема:

Они корректно connectTCP к серверу через ws и обмениваются первыми несколькими сообщениями. Примерно через минуту они должны отправить сообщение на сервер через

def execute(self, message, callback=None):
    print(">>>", message, flush=True)
    reactor.callFromThread(self._client_protocol_instance.send, message, callback)

Метод self._client_protocol_instance.send определяется следующим образом:

def send(self, command, callback):
    print("send", command, callback, flush=True)
    timestamp = int(time() * 1000000)
    msg = (command.strip() + " --timestamp:" + str(timestamp))
    if _self._debug:
        _self._commands[str(timestamp)] = msg
    if callback is not None:
        _self._callbacks[str(timestamp)] = callback
    payload = msg.encode()
    _self._status_controller.set_state(payload)
    self.sendMessage(payload)

Первый print отображается в стандартном выводе, а второй нет. Я предполагаю, что send не выполняется. После reactor.run() это единственная ссылка на reactor во всей программе.

Уничтожение клиентского процесса после этого немедленно обнаруживается сервером, поэтому соединение в то время еще было активным.

Что может быть причиной этого?


person Mirac7    schedule 06.12.2016    source источник


Ответы (1)


Я нашел решение, проблема заключалась в том, что предыдущая задача иногда не заканчивалась к тому времени, когда она пыталась отправить сообщение.

Я решил эту проблему, переместив всю логику обработки ответов с высокой нагрузкой на процессор в потоки, чтобы освободить реактор для других сообщений.

person Mirac7    schedule 06.12.2016