2013-08-27 3 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

хорошо, я был в состоянии сделать это с помощью резьбы и с библиотекой monkeypatch 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 на другом порту. Я думаю, что решение для базы данных не будет достаточно быстрым: количество сообщений в секунду в среднем не может быть использовано в тысячах сообщений. Я бы хотел в конце концов демонизировать оба процесса, поэтому, если их можно независимо запустить и остановить. Для этого потребуется какая-то транспортная связь между ними. На данный момент это просто работает, и запуск их из одного и того же процесса помогает мне быстрее разрабатывать и тестировать другие функции. – domoarrigato