Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2012 22:59:58

dobryak
От:
Зарегистрирован: 2011-06-10
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Python Twisted

Здравствуйте. С питом начал знакомство совсем недавно, начал разбирать с фреймворком twisted скачал пример реализации сервера чата:

"""The most basic chat protocol possible.

run me with twistd -y chatserver.py, and then connect with multiple
telnet clients to port 1025
"""

from twisted.protocols import basic



class MyChat(basic.LineReceiver):
def connectionMade(self):
print "Got new client!"
self.factory.clients.append(self)

def connectionLost(self, reason):
print "Lost a client!"
self.factory.clients.remove(self)

def lineReceived(self, line):
print "received", repr(line)
for c in self.factory.clients:
c.message(line)

def message(self, message):
self.transport.write(message + '\n')

from twisted.internet import protocol
from twisted.application import service, internet

factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []

application = service.Application("chatserver")
internet.TCPServer(1025, factory).setServiceParent(application)
На этом этапе все ясно, только вот возник вопрос как заставить TCPServer биндить не блокирующий сокет?.
Скажем для пример запускаю я 1 инстанс приложения:
twistd -y chatserver.py
Все впорядке, после пробую запустить еще один инстанс
twistd -y –pidfile chatserver2 chatserver.py (–pidfile - чтобы использовать другое имя .pid файла)
И конечно же как и следовало ожидать при старте второго экземпляра приложения я получаю:
Address already in use
Заранее благодарен за Ваши ответы!



Отредактировано (Янв. 14, 2012 23:01:36)

Офлайн

#2 Янв. 15, 2012 01:53:22

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Python Twisted

Вопрос не понятен - Twisted как раз неблокирующие сокеты создает.
Если нужен второй чат сервер на той же машине - то нужно менять порт, два процесса не могут слушать один и тот же TCP порт.

Отредактировано (Янв. 15, 2012 01:54:28)

Офлайн

#3 Янв. 15, 2012 13:11:30

dobryak
От:
Зарегистрирован: 2011-06-10
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Python Twisted

s0rg - “два процесса не могут слушать один и тот же TCP порт.”
Ошибаетесь, могут. Например в PHP - это будет что-то типа:

socket_set_nonblock($socket)
или
socket_set_option($sock, SOL_SOCKET, SO_REUSEPORT, 1)

В документации по Twisted ничего подобного не смог найти. Неужели никто не сталкивался с этим?



Офлайн

#4 Янв. 15, 2012 14:21:26

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Python Twisted

dobryak
Ошибаетесь, могут.
SO_REUSEPORT / SO_REUSEADDR следует применять только чтобы обеспечить безпроблемный перезапуск приложения.
В других случаях - это быдлокод имхо.

Офлайн

#5 Янв. 15, 2012 14:35:51

dobryak
От:
Зарегистрирован: 2011-06-10
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Python Twisted

s0rg
В других случаях - это быдлокод имхо.
В PHP фреймверке phpdaemon, реализованно именно так. В каждом воркере инициализируется например HTTP сервер и биндится к сокету. Далее при коннекте клиента в воркере проверяется может ли он обслужить этого клиента (Сверяется количетсво клиентов которое он уже обслуживает с макс заданым количеством) и аццептит соединение, таким вот образом происходит балансировка.
А реализацию каждый инстанс чата на отдельном порту - это не “быдлокод”?



Офлайн

#6 Янв. 15, 2012 14:46:01

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Python Twisted

dobryak
А реализацию каждый инстанс чата на отдельном порту
Зачем???

Офлайн

#7 Янв. 15, 2012 14:47:49

dobryak
От:
Зарегистрирован: 2011-06-10
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Python Twisted

s0rg
Зачем???
Маштабируемость



Офлайн

#8 Янв. 15, 2012 14:58:01

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Python Twisted

Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?

Офлайн

#9 Янв. 15, 2012 15:01:07

dobryak
От:
Зарегистрирован: 2011-06-10
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Python Twisted

s0rg
Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?
Потэтому я и обратился к Вам, потому как не нашел в док то, что мне нужно, а разбираться в исходниках твистеда займет много времени. Объясните тогда, пожалуйста, каким образом я смогу маштабировать приложение вот даже на этом примере сервера для чата? Заранее благодарен!



Офлайн

#10 Янв. 15, 2012 15:01:14

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Python Twisted

dobryak
У Вас какая-то очень наваристая каша в голове:-)

Неблокирующий сокет это вовсе не то, что Вы подразумеваете. Неборкирующими становятся операции над ним (чтение, запись и т.д.), а не возможность биндить его адрес и порт из разных процессов. Twisted использует неблокирующий сокет по прямому назнаения – осущеставляет неблокирющий ввод/вывод.

Возможность задать сокету не эксклюзивный бинд, это совершенно иная задача. И это не рекомендуется для промышленного использования в том виде, в котором этого хотите Вы.

И кстати, как можно судить по документации php – приведенные Вами функции как раз делают эти две абсолютно разные операции над сокетами.

Правильный способ, которым пользуются многие веб и иные серверы – забиндить сокет один раз в одном процессе и потом разфоркаться. Тогда все дочернии процессы получают копию этого сокета и могут на нем принимать новые соединения. Именно этот способ Вам нужно использовать для реализации “воркеров” чата.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version