Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Многопользовательский сервер python
Просмотров: 308
 
Ответов: 2
Доброе время суток, в ВУЗе дали задание сделать отказоустойчивую систему. Я предпочел написать ее на питоне.
Но так как язык для меня новый, второй день на нем пишу возникают вопросы:
Как создать приложение-сервер, которое будет работать одновременно с двумя или более клиентами, плюс альтернативный (для отказоустойчивости) второй сервер.
Т.е. примерно так:
Альтернативный <----------> Основной
сервер сервер
/ | \
Клиент Клиент Клиент
Что-то читал про 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)
Сама суть программы — расчет числа Фибоначчи.
Клиент, который подключается первым отправляет введенное пользователем число (номер по порядку числа Фибоначчи), затем сервер отправляет это число на остальные подключенные клиенты, затем каждый клиент считает последующую итерацию, и отправляет ее на сервер, сервер сравнивает результаты, и использует принцип голосования (если какой-то клиент отправил неожиданные данные, то его ответ считается неверным, это записывается в лог и клиент принудительно отключается). Стоит учесть отказ основного сервера, если это произошло, то клиенты должны автоматически подключится к альтерантивному серверу и продолжать вычисление.
# -*- 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)
С самого начала ты пошёл в верную сторону — Twisted.
Если уж ты и хочешь «шустрый, отказоустойчивый сервер», то лучший вариант — писать такое приложение на Twisted, как библиотеку, разработанную для этих целей. Тем более что примеров там хватает(http://twistedmatrix.com/documents/current/core/examples/#auto0)
Если тебе просто нужно смоделировать такую систему, то тебе нужно сделать нормальную схему работы.
Я бы тебе посоветовал почитать про TCP, тогда это тебя избавит от проблем синхронизации, т.к. алгоритм будет многим проще(хинт: погугли чем различаются UDP и TCP).
А вообще, судя по тому, что ты пишешь систему на языке, который не изучал(т.е. вам его не преподавали?), значит что преподаватель просто дал случайную задачу, чтобы тебя занять чем-то интересным. В таком случае я тем более советую изучать Twisted, т.е. больше нового узнаешь, будет опыт и о большем сможешь рассказать.
Если же вас обучали Python'у, но ты прогулял, то… Ну плохо дело, всё-равно учи Twisted или бегай по форумам, сцеживай решение. И да, если у вас обучали Python'у, будь добр, скажи что за учебное заведение.
Ой жуть какая X_X…
Лучше бы такого рода задачи на Erlang делать, но раз уж решили на питоне…
Для начала — у вас и сервер(ы) и клиенты — все в одном процессе? Просто в разных тредах? Это не очень-то похоже на отказоустойчивую систему…
Далее, раз у вас сервер занимается только распределением расчетов между клиентами, то Twisted тут сам б-г велел испольовать.
Вообще написали-бы вы прям 1 в 1 формулировку задания и название предмета к которому это задание, чтоб точно понять что нужно.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться