2013-01-17 94 views
0

我是python的新手,所以请原谅,如果问题提前没有意义。Python服务器交互

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

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

这是目录结构: 的src/- >所有.py文件只有一个文件主要有

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

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

+1

这将有助于查看与您的问题有关的代码。 – 2013-01-17 00:54:36

回答

2

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

你可能会看看现有的协议,例如REST想法。

2

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

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

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

,如果你解释如何我可以做这些更具体现在正在处理服务器中的异步I/O。选择(或轮询/ kqueue/epoll)循环?每个连接线程?神奇的greenlets?非魔法协作穿线(如PEP 3156 /郁金香)?即使仅仅是“我所知道的是,我们正在使用twisted/tornado/gevent /等,所以无论是做”是不够的。

+0

这是一个很好的概要,从我的答案中可以看出,我更喜欢单个服务器,单端口,可能是多线程RESTful服务器。 –

+0

@PeterWooster:如果原始主服务器不是RESTful,那么重新设计一切只是添加一个状态服务器有点愚蠢。用多线程设计替换一个工作事件循环设计只是为了添加一个状态服务器会更加麻烦(特别是因为它可能会将最大连接数从10K降到1K ...)。那么,为什么在完全没有必要的情况下将这些限制放在解决方案空间上呢? – abarnert

+0

他们不是限制,只是喜好。我怀疑目前的设计并不完整,但我可能在这方面是错误的,OP尚不清楚。 –