Twisted - прослушивание нескольких портов для нескольких процессов с одним реактором - PullRequest
3 голосов
/ 11 сентября 2009

Мне нужно запустить несколько экземпляров моего серверного приложения, каждый на своем собственном порту. Это не проблема, если я начну их с os.system или subprocess.Popen, но я бы хотел иметь некоторое взаимодействие с процессом с многопроцессорностью.

Я бы хотел как-то динамически настроить прослушивание разных портов из разных процессов. Просто вызывать реактор.listenTCP этого не делает, потому что я получаю странное сообщение об ошибке 22 при остановке реактора. Я также уверен, что это не правильный способ сделать это. Я искал примеры, но ничего не смог найти. Любая помощь приветствуется.

EDIT: Спасибо, Цуры, это то, что я хотел бы получить. Но я должен динамически добавлять порты для прослушивания. Например

from twisted.internet import reactor 
from multiprocessing import Process 

def addListener(self, port, site): 
    ''' Called when I have to add new port to listen to. 
    site - factory handling input, NevowSite in my case''' 
    p = Process(target=f, args=(port, func)) 
    p.start() 

def f(self, port, func): 
    ''' Runs as a new process''' 
    reactor.listenTCP(port, func)

Мне нужен способ аккуратно остановить такие процессы. Простое обращение к реактору.stop (), останавливающему дочерний процесс, не делает этого.

Это ошибка, которую я получаю, когда пытаюсь остановить процесс

    --- <exception caught here> ---
  File "/usr/share/exe/twisted/internet/tcp.py", line 755, in doRead
    skt, addr = self.socket.accept()
  File "/usr/lib/python2.6/socket.py", line 195, in accept
    sock, addr = self._sock.accept()
<class 'socket.error'>: [Errno 22] Invalid argument

Dimitri.

1 Ответ

9 голосов
/ 13 сентября 2009

Я не уверен, какую ошибку вы получаете. Ниже приведен пример с витой сайт (изменено) И, как вы можете видеть, он прослушивает два порта и может слушать еще много.

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor

class QOTD(Protocol):

    def connectionMade(self):
        self.transport.write("An apple a day keeps the doctor away\r\n") 
        self.transport.loseConnection()

# Next lines are magic:
factory = Factory()
factory.protocol = QOTD

# 8007 is the port you want to run under. Choose something >1024
reactor.listenTCP(8007, factory)
reactor.listenTCP(8008, factory)
reactor.run()
...