如何使用callfromthread来调用扭曲的协议方法?

时间:2014-04-13 08:38:54

标签: python twisted

我有一个扭曲的Web套接字客户端协议,我在这个反应器循环中有另一个套接字服务器 如何从套接字服务器访问sendMessage方法? 我看到这个link,但我没有得到我应该做的。我试试这个,但是我收到了一些错误:

reactor.callFromThread(WebSocketClientProtocol.sendMessage, protocol,  'data')
exceptions.TypeError: unbound method sendMessage() must be called with WebSocketClientProtocol instance as first argument (got module instance instead)

我的websocket客户端:

class WebSocketProtocol(WebSocketClientProtocol):


   def sendHello(self):
      self.sendMessage("something")

   def onOpen(self):
      self.sendHello()

   def onMessage(self, msg, binary):
      print msg

websocket_factory = WebSocketClientFactory("ws://localhost:1025/ws")
websocket_factory.protocol = WebSocketProtocol
connectWS(websocket_factory)

我用这段代码解决了它:

class WebSocketProtocol(WebSocketClientProtocol):


   def onOpen(self):
        self.factory.data = []
        self.factory.data.append(self)

reactor.callFromThread(WebSocketClientProtocol.sendMessage, websocket_factory.data[0],  send)

1 个答案:

答案 0 :(得分:4)

callFromThread仅适用于程序中有多个线程的情况。仅仅因为你有多个服务器并不意味着你有多个线程。事实上,Twisted主要面向运行多个服务器(和/或客户端)而不使用任何额外的线程。

您遇到的具体错误是关于如何在实例上调用实例方法

WebSocketClientProtocol是一个类,WebSocketClientProtocol.sendMessage是一个未绑定的方法。这就像试着写:

class Foo(object):
    def bar(self):
        print "Foo.bar:", self

Foo.bar()

这不会比你尝试的更好,因为你当然需要一个实例:

foo = Foo()
...
foo.bar()