Задать вопрос

Многопользовательский сервер python

Доброе время суток, в ВУЗе дали задание сделать отказоустойчивую систему. Я предпочел написать ее на питоне.

Но так как язык для меня новый, второй день на нем пишу возникают вопросы:
Как создать приложение-сервер, которое будет работать одновременно с двумя или более клиентами, плюс альтернативный (для отказоустойчивости) второй сервер.

Т.е. примерно так:
  
      Альтернативный     <---------->                              Основной
             сервер                                                сервер   
                                                            /         |          \
                                                      Клиент          Клиент       Клиент


Что-то читал про twisted, что-то про select, но в конце концов так и не понял как и что.
Вот мой быдлокод сервера:
# -*- coding: cp1251 -*-
import socket, string, threading, sys

def sync(sock):
  sock.send('sync ok!')
  
def alt(num):
  print """
  ====================
    AltServer thread ok
  ====================
  """
      
def listen(port, first = False, num = 0):
  srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  srv.bind(("localhost", port))

  while 1:
      print "Listen...", port
      print "Thread: ", threading.currentThread(), " Num: ", num, "\n" 
      srv.listen(1)             
      global sock
      sock, addr = srv.accept()
      while 1:
        rec = sock.recv(1)
        if not rec: 
          break
        else:
          if (first):
            while 1:
              num = sock.recv(16)
              if not num: 
                break
              else:
                print "Number rcvd success! (", num ,")" 
                sock.send("ok")
                proc2 = threading.Thread(target=listen, name="cli2", args=[30001, False, num])
                proc3 = threading.Thread(target=listen, name="cli3", args=[30002, False, num])
                proc4 = threading.Thread(target=alt, name="altserver", args=[num])
                proc2.start()
                proc3.start()
                proc4.start()
              
          else:
            sock.send(num)
            status = sock.recv(16)
            while 1:
              if not status: 
                break
              else:
                if (status == "ok"):
                  sync(sock)
                else:
                  sync(sock)
                  print "error, pack:", status
                  break
        print "From %s:%s:" % addr, rec
        
      sock.close()
  
def main():
  proc1 = threading.Thread(target=listen, name="cli1", args=[30000, True])
  proc1.start()

main()
sys.exit(0)


Сама суть программы — расчет числа Фибоначчи.
Клиент, который подключается первым отправляет введенное пользователем число (номер по порядку числа Фибоначчи), затем сервер отправляет это число на остальные подключенные клиенты, затем каждый клиент считает последующую итерацию, и отправляет ее на сервер, сервер сравнивает результаты, и использует принцип голосования (если какой-то клиент отправил неожиданные данные, то его ответ считается неверным, это записывается в лог и клиент принудительно отключается). Стоит учесть отказ основного сервера, если это произошло, то клиенты должны автоматически подключится к альтерантивному серверу и продолжать вычисление.
  • Вопрос задан
  • 15194 просмотра
Подписаться 11 Оценить 1 комментарий
Решения вопроса 1
DeNnEr
@DeNnEr
С самого начала ты пошёл в верную сторону — Twisted.
Если уж ты и хочешь «шустрый, отказоустойчивый сервер», то лучший вариант — писать такое приложение на Twisted, как библиотеку, разработанную для этих целей. Тем более что примеров там хватает(http://twistedmatrix.com/documents/current/core/examples/#auto0)
Если тебе просто нужно смоделировать такую систему, то тебе нужно сделать нормальную схему работы.
Я бы тебе посоветовал почитать про TCP, тогда это тебя избавит от проблем синхронизации, т.к. алгоритм будет многим проще(хинт: погугли чем различаются UDP и TCP).
А вообще, судя по тому, что ты пишешь систему на языке, который не изучал(т.е. вам его не преподавали?), значит что преподаватель просто дал случайную задачу, чтобы тебя занять чем-то интересным. В таком случае я тем более советую изучать Twisted, т.е. больше нового узнаешь, будет опыт и о большем сможешь рассказать.
Если же вас обучали Python'у, но ты прогулял, то… Ну плохо дело, всё-равно учи Twisted или бегай по форумам, сцеживай решение. И да, если у вас обучали Python'у, будь добр, скажи что за учебное заведение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
seriyPS
@seriyPS
Ой жуть какая X_X…

Лучше бы такого рода задачи на Erlang делать, но раз уж решили на питоне…

Для начала — у вас и сервер(ы) и клиенты — все в одном процессе? Просто в разных тредах? Это не очень-то похоже на отказоустойчивую систему…

Далее, раз у вас сервер занимается только распределением расчетов между клиентами, то Twisted тут сам б-г велел испольовать.

Вообще написали-бы вы прям 1 в 1 формулировку задания и название предмета к которому это задание, чтоб точно понять что нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы