我是python的新手所以如果问题提前没有意义,请原谅我。
我们有一个python消息服务器,其中有一个带有main函数的server.py文件。它还有一个类“* server”,main定义了这个类的全局实例“the_server”。同一文件或差异模块中的所有其他函数(在同一个目录中)将此实例导入为“来自主导入the_server”。
现在,我的工作是设计一种机制,允许我们从上述消息服务器获取最新的消息状态(消息数量等)。
这是dir结构: src / - >所有.py文件只有一个文件有主
在同一个目录中,我创建了另一个状态服务器,其主函数监听不同端口上的连接,我希望每次客户端询问我的消息状态时,我都可以在我的消息服务器上调用函数返回预期的数字。
如何在我的状态服务器中导入全局实例“the_server”,或者它是正确的方法?
答案 0 :(得分:2)
您应该使用单个服务器并设计支持多种消息的协议。 '发送'邮件已发送,' recv'消息读取任何现有消息,状态'邮件获取服务器状态,'停止'消息将其关闭等等。
您可以查看现有的协议,例如REST,以获取创意。
答案 1 :(得分:2)
除非您的“状态服务器”和“真实服务器”在同一进程中运行(即松散地,其中一个导入另一个并启动它),否则状态服务器中的from main import the_server
不是去帮忙。这只会给你一个新的,完全独立的the_server
实例,它没有做任何事情,你可以报告其状态。
有几种明显的方法可以解决这个问题。
mmap
或multiprocessing.Array
中,而不是直接存储在Server
对象中,以便状态服务器可以打开相同的mmap
/等等并从中读取。 (你可能能够将Server
对象本身放在共享内存中,但即使你可以使它工作,我也不建议这样做。)如果您解释了今天如何处理服务器中的异步I / O,我可以使这些更具体。选择(或poll / kqueue / epoll)循环?每个连接的线程?神奇的小米?非神奇的合作线程(如PEP 3156 / tulip)?即使只是“我所知道的是我们正在使用twisted
/ tornado
/ gevent
/等等,所以无论做什么”都足够了。