Найти - Пользователи
Полная версия: Python Twisted
Начало » Python для новичков » Python Twisted
1 2
dobryak
Здравствуйте. С питом начал знакомство совсем недавно, начал разбирать с фреймворком 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
Заранее благодарен за Ваши ответы!
s0rg
Вопрос не понятен - Twisted как раз неблокирующие сокеты создает.
Если нужен второй чат сервер на той же машине - то нужно менять порт, два процесса не могут слушать один и тот же TCP порт.
dobryak
s0rg - “два процесса не могут слушать один и тот же TCP порт.”
Ошибаетесь, могут. Например в PHP - это будет что-то типа:

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

В документации по Twisted ничего подобного не смог найти. Неужели никто не сталкивался с этим?
s0rg
dobryak
Ошибаетесь, могут.
SO_REUSEPORT / SO_REUSEADDR следует применять только чтобы обеспечить безпроблемный перезапуск приложения.
В других случаях - это быдлокод имхо.
dobryak
s0rg
В других случаях - это быдлокод имхо.
В PHP фреймверке phpdaemon, реализованно именно так. В каждом воркере инициализируется например HTTP сервер и биндится к сокету. Далее при коннекте клиента в воркере проверяется может ли он обслужить этого клиента (Сверяется количетсво клиентов которое он уже обслуживает с макс заданым количеством) и аццептит соединение, таким вот образом происходит балансировка.
А реализацию каждый инстанс чата на отдельном порту - это не “быдлокод”?
s0rg
dobryak
А реализацию каждый инстанс чата на отдельном порту
Зачем???
dobryak
s0rg
Зачем???
Маштабируемость
s0rg
Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?
dobryak
s0rg
Может, сначала стоит прочитать доку по Twisted и разобраться как он работает?
Потэтому я и обратился к Вам, потому как не нашел в док то, что мне нужно, а разбираться в исходниках твистеда займет много времени. Объясните тогда, пожалуйста, каким образом я смогу маштабировать приложение вот даже на этом примере сервера для чата? Заранее благодарен!
Александр Кошелев
dobryak
У Вас какая-то очень наваристая каша в голове:-)

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

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

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

Правильный способ, которым пользуются многие веб и иные серверы – забиндить сокет один раз в одном процессе и потом разфоркаться. Тогда все дочернии процессы получают копию этого сокета и могут на нем принимать новые соединения. Именно этот способ Вам нужно использовать для реализации “воркеров” чата.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB