2016-12-06 9 views
0

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

Они правильно 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 во всей программе.

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

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

ответ

0

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

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