Python服务器交互

时间:2013-01-17 00:37:49

标签: python client-server messaging

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

您应该使用单个服务器并设计支持多种消息的协议。 '发送'邮件已发送,' recv'消息读取任何现有消息,状态'邮件获取服务器状态,'停止'消息将其关闭等等。

您可以查看现有的协议,例如REST,以获取创意。

答案 1 :(得分:2)

除非您的“状态服务器”和“真实服务器”在同一进程中运行(即松散地,其中一个导入另一个并启动它),否则状态服务器中的from main import the_server不是去帮忙。这只会给你一个新的,完全独立的the_server实例,它没有做任何事情,你可以报告其状态。

有几种明显的方法可以解决这个问题。

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

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