【发布时间】:2015-09-23 08:43:49
【问题描述】:
我正在使用 tornado 和 websockets(sockjs) 并且在处理传入消息时遇到了麻烦,解决了这种特定情况,即循环类引用的情况。这个问题与 websocket 本身无关,而本质上是周期性。
这是定义类Socket 用于处理传入消息的文件,它还定义了需要类Socket 的类Async。 on_message 在收到来自客户端的消息时触发:
from logicmodule import Logic
class Async(object):
def notify_user(self, *args):
print("Notifying user!")
Socket.send_message("ASYNC CALLBACK: notify_user ARGS: {:}\n".format(args))
async = Async()
logic = Logic(async)
class Socket(SockJSConnection):
clients = set()
def on_open(self, request):
print("Opened Connection...")
self.clients.add(self)
def send_message(self, message, operation):
return self.send(json.dumps({
'operation': operation,
'data': message,
}))
def on_message(self, msg):
data = json.loads(msg)
projectData = logic.create_project(data['project_info'])
self.send_message(projectData, data['operation'])
编辑:
逻辑类实现了一个方法create_project,将async 类作为参数,其方法notify_user 在create_project 方法中被调用。 notify_user 需要 Socket 类的实例,该实例只能在 on_open 方法中的传入消息上创建。该实例将是一个持久连接,消息将通过该连接以notify_user 方法发送回用户。
这可能是一个简单的 hack,但我是 python 新手。如何在必须事先提供给logic 的传入消息上向Async 提供一个Socket 实例?请帮忙,谢谢!
【问题讨论】:
-
您已经在解决方案中提供了它,有什么问题?
-
@hspandher 他有循环依赖;文件 A 导入 B,文件 B 导入 A
-
这里的A、B两个模块是什么?我的意思是你还没有描述你在哪里遇到循环依赖问题。
-
Async是否需要 类Socket或Socket的实例?在示例中Socket.send_message()似乎没有意义,因为send_message()不是静态/类方法。 -
@dhke 它需要实例,但只能在传入消息上创建实例。我不确定如何在 on_mesage 中实例化 Socket,然后将其交给逻辑。
标签: python circular-dependency