【发布时间】:2016-01-08 11:56:03
【问题描述】:
首先,有一个IO 类,它在__init__ 上传递了之前在主类中创建的异步循环对象(io = IO(loop))。 IO 类然后在某些时候通过执行self.socket = Socket(self) 来初始化Socket 类,以便套接字对象具有向后访问权限。后来Socket类初始化Websocket类,它是Transport的子类
class Websocket(Transport):
name = 'websocket'
def __init__(self, socket):
self.socket = socket
def open(self):
url = self.prepareUrl()
factory = WebSocketClientFactory(url, debug = False)
factory.protocol = Protocol
websocket = self.socket.loop.create_connection(factory, host=self.socket.io.options.host, port=self.socket.options.port)
self.socket.io.loop.run_until_complete(websocket)
def onOpen(self):
print('print me please!')
因此,socket 对象调用self.transport.open()(其中self.transport = Websocket(self)),它创建高速公路工厂,通过执行self.socket.loop.create_connection() 创建异步连接,然后通过执行run_until_complete() 将coro future 添加到循环中。
现在,问题就从这里开始:
高速公路工厂需要一个类,该类必须继承自autobahn.asyncio.websocket.WebSocketClientProtocol
我的班级Protocol(WebSocketClientProtocol) 有平常的:
class Protocol(WebSocketClientProtocol):
@asyncio.coroutine
def onOpen(self):
print('socket opened!')
这工作得很好,print('socket opened!') 确实打印了字符串,我的服务器也说连接是打开的。
问题:
从 Protocol() 类中,当高速公路调用 onOpen() 回调时,如何使此方法调用 transport.onOpen() 方法并执行print('print me please!')?
【问题讨论】:
-
目前我发现的唯一解决方案是在循环对象中引用套接字对象,这样我就可以从
Protocol.onOpen()协程中执行类似self.factory.loop.socket.transport.onOpen()的操作。为了使事情更漂亮,我可以将循环对象作为基线传递,它的结构类似于loop.io.socket.transport。但同样,循环对象是否真的打算在其内部保存第三方引用?对我来说,这看起来有点太 hacky... -
在 cpp 中,我将信号 2 用于类似目的,出于某种原因,这次我试图为 python 搜索术语“信号”......当然还没有找到任何相关的东西...... . 现在,我正在研究 PyDispatcher 和其他人。如果在我找到足够好的解决方案之前没有人发帖,我会自行回答 q。我想我现在走在正确的轨道上。
标签: python python-3.x python-asyncio autobahn