如何在Twisted中使用callFromThread调用协议的方法?

2 投票
1 回答
1053 浏览
提问于 2025-04-18 02:34

我有一个扭曲的网络套接字客户端协议,同时在这个反应循环中还有另一个套接字服务器。我该如何访问套接字服务器中的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()

撰写回答