2013-08-27 46 views
0

目前,我有一个应用程序有两台服务器:第一个进程命令并单独响应,第二个进程将结果广播给其他感兴趣的订户。他们需要从不同的港口提供服务。我可以开始()他们两个,但我只能得到一个或另一个serve_forever(),因为我读它是一个阻塞函数。我正在寻找关于如何保持两台服务器不会退出的想法。以下简称代码:如何让多个gevent服务器永久服务?

def main(): 
    stacklist = [] 
    subslist = [] 
    stacklist.append(CreateStack('stuff')) 
    subslist.append(Subscription('stuff')) 
    bcastserver = BroadcastServer(subslist) # creates a new server 
    tradeserver = TradeServer(stacklist) # creates a new server 
    bcastserver.start() # start accepting new connections 
    tradeserver.start() # start accepting new connections 
    #bcastserver.serve_forever() #if I do it here, the first one... 
    #tradeserver.serve_forever() #blocks the second one 

class TradeServer(StreamServer): 
    def __init__(self, stacklist): 
     self.stacklist = stacklist 
     StreamServer.__init__(self, ('localhost', 12345), self.handle) 
     #self.serve_forever() #If I put it here in both, neither works 

    def handle(self, socket, address): 
     #handler here 

class BroadcastServer(StreamServer): 
    def __init__(self, subslist): 
     StreamServer.__init__(self, ('localhost', 8000), self.handle) 
     self.subslist = subslist 
     #self.serve_forever() #If I put it here in both, neither works 

    def handle(self, socket, address): 
     #handler here 

也许我只是需要一种方法来保持两个从离开,但我不知道怎么样。最后,我希望两台服务器都可以永远监听传入的连接并处理它们。

回答

0

好吧,我能做到这一点使用线程和与GEVENT的猴补丁库:

from gevent import monkey 
def main(): 
    monkey.patch_thread() 
# etc, etc 
t = threading.Thread(target=bcastserver.serve_forever) 
t.setDaemon(True) 
t.start() 
tradeserver.serve_forever() 
0

在自己的Python实例中启动每个服务器循环(每个gevent有一个控制台)。我从来没有理解尝试从一个程序运行多个服务器。您可以多次运行同一台服务器,并使用像nginx这样的反向代理来相应地进行负载平衡和路由。

+0

两台服务器需要共享相同的内部状态 – domoarrigato

+0

现在我们需要问自己,如果这是一个很好的设计决策。 – blakev

+0

是的,我同意这不是理想的。该设计需要广播服务器通过一个端口发布基于订阅的活动摘要,并通过另一个端口上的不同API处理交互。我认为一个数据库解决方案不会足够快:每秒消息的平均轮询次数不能超过000次。我想最终将这两个进程守护进程,所以如果他们可以独立启动并停止。这需要它们之间的某种传输链接。目前,它只是起作用,并且从同一进程运行它们可帮助我更快地开发和测试其他功能。 – domoarrigato