0

我是python的新手,所以如果问题事先没有意义,请原谅。

我们有一个 python 消息服务器,它有一个文件 server.py,其中包含主要功能。它还有一个类“*server”,main 定义了这个类的一个全局实例,“the_server”。同一文件或差异模块(在同一目录中)中的所有其他函数将此实例导入为“从主导入 the_server”。

现在,我的工作是设计一种机制,允许我们从上述消息传递服务器获取最新的消息状态(消息数量等)。

这是 dir 结构: src/ -> 所有 .py 文件只有一个文件有 main

在同一个目录中,我创建了另一个状态服务器,其主函数侦听不同端口上的连接,我希望每次客户端向我询问消息状态时,我都可以调用消息服务器上的函数,该函数返回预期的数字.

如何在我的状态服务器中导入全局实例“the_server”,或者说这是正确的方法吗?

4

2 回答 2

2

您可能应该使用单个服务器并设计一个支持多种消息的协议。'send' 消息被发送,'recv' 消息读取任何现有消息,'status' 消息获取服务器状态,'stop' 消息将其关闭,等等。

您可能会查看现有的协议(例如 REST)来寻找想法。

于 2013-01-17T00:50:07.863 回答
2

除非您的“状态服务器”和“真实服务器”在同一个进程中运行(也就是说,松散地,其中一个导入另一个并启动它),否则仅from main import the_server在您的状态服务器中无济于事。这只会给你一个新的、完全独立的实例,the_server它什么都不做,然后你可以报告它的状态。

有一些明显的方法可以解决这个问题。

  • 正如 Peter Wooster 建议的那样,通过扩展现有协议来处理与状态相关的请求,将状态服务器完全合并到真实服务器中。
  • 将状态服务器合并到真正的服务器异步 I/O 实现中,但仍侦听两个不同的端口,每个端口使用不同的协议处理程序。
  • 将状态服务器合并到真实的服务器进程中,但使用单独的异步 I/O 实现。
  • 将状态信息存储在例如 ammap或 a中,multiprocessing.Array而不是直接存储在Server对象中,以便状态服务器可以打开相同的mmap/etc。并从中读取。(您也许可以将Server对象本身放在共享内存中,但即使您可以使其工作,我也不建议这样做。)

如果您解释了今天如何处理服务器中的异步 I/O,我可以让这些更具体。选择(或 poll/kqueue/epoll)循环?每个连接的线程?神奇的绿叶?非神奇的协作线程(如 PEP 3156/tulip)?即使只是“我所知道的是我们正在使用twisted/ tornado/ gevent/等,所以无论做什么”就足够了。

于 2013-01-17T01:03:03.770 回答