Twisted reactor没有正确调用线程中的函数

时间:2016-12-06 12:36:06

标签: reactor twisted.internet

我遇到问题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出现在stdout中,但第二个出现在stdout中。我假设send没有被执行。在reactor.run()之后,这是整个程序中reactor的唯一引用。

服务器立即检测到在此情况发生后杀死客户端的进程,因此此时连接仍处于活动状态。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,问题在于上一个任务在尝试发送消息时有时无法完成。

我通过将所有cpu-heavy响应处理逻辑移动到线程中来解决它,以释放反应堆以获取其他消息。