如何在Twisted中使用callFromThread调用协议的方法?
我有一个扭曲的网络套接字客户端协议,同时在这个反应循环中还有另一个套接字服务器。我该如何访问套接字服务器中的sendMessage方法呢?我看了这个链接,但我还是没明白我该怎么做。我试过这个,但出现了一些错误:
reactor.callFromThread(WebSocketClientProtocol.sendMessage, protocol, 'data')
exceptions.TypeError: unbound method sendMessage() must be called with WebSocketClientProtocol instance as first argument (got module instance instead)
我的网络套接字客户端:
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 个回答
4
callFromThread
这个东西是用在你程序里有多个 线程 的时候。单单有多个服务器并不代表你就有多个线程。实际上,Twisted 这个框架主要是为了让你可以在不使用额外线程的情况下,运行多个服务器(或者客户端)。
你遇到的具体错误是因为你需要在一个 实例 上调用一个 实例方法。
WebSocketClientProtocol
是一个类,而 WebSocketClientProtocol.sendMessage
是一个没有绑定的(unbound)方法。这就像你试图写:
class Foo(object):
def bar(self):
print "Foo.bar:", self
Foo.bar()
这和你之前尝试的并没有什么区别,因为你当然需要有一个实例:
foo = Foo()
...
foo.bar()