【问题标题】:how can I use callfromthread to call a method of a protocol in twisted?如何使用 callfromthread 以扭曲方式调用协议的方法?
【发布时间】:2014-04-14 17:26:52
【问题描述】:

我有一个扭曲的 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)

【问题讨论】:

    标签: python twisted


    【解决方案1】:

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

    您遇到的具体错误是关于您需要如何在 instance 上调用 instance 方法

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

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

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

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

    【讨论】:

    • 那我该怎么称呼它呢?我的意思是什么是扭曲的方式?
    • 您可以使用从WebSocketClientFactory 派生的工厂,它会记住它创建的协议实例(在buildProtocol 中)。然后,此引用可用于提供与 callFromThread 一起使用所需的 instance 参数(假设可以从您要触发 sendMessage 的位置访问工厂)。
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2011-05-17
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多