Twisted - 使用一个反应器监听多个进程的多个端口

4
我需要在不同的端口上运行多个服务器应用程序实例。如果我使用os.system或subprocess.Popen启动它们,这不是问题,但我想使用multiprocessing进行一些进程通信。我想以某种方式动态设置来自不同进程的不同端口的侦听。仅仅调用reactor.listenTCP并不能做到这一点,因为在停止反应器时我会得到奇怪的Errno 22错误。我也很确定这不是正确的方法。我查找了示例,但找不到任何内容。感谢您的帮助。
编辑: 谢谢Tzury,这与我想要的有点相似。但我必须动态添加要侦听的端口。例如:
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)

我需要一种整洁的方法来停止这样的进程。仅仅调用reactor.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

迪米特里。

其实,这是做事的正确方式。你可以在单个反应器中拥有任意数量的不同服务器监听不同的端口......整个反应器的目的就是只有一个。那么,在你的协议实现中你会怎么做呢? - Dirk
我将端口绑定到NevowSite实例(希望这就是你的意思)。那么,我应该如何从端口“取消侦听”反应器?在添加新端口进行侦听之前,我是否必须停止反应器?我从不同的进程中执行此操作是否会有问题?对不起,问了这么多问题,但我真的找不到关于这个问题的教程或易懂的文档。 - user164039
你为什么要启动多个进程?Twisted被设计成只在单个进程中使用一个反应器。 - Tom Leys
事实上,调用listenTCP应该就可以了。如果您仍然对这个问题的答案感兴趣,如果您能提供导致“错误22”的示例代码,那将会很有帮助。 - Glyph
1个回答

12

我不确定你遇到了什么错误。 以下是来自twisted site(修改后)的示例 正如您所见,它在两个端口上侦听,并且可以侦听更多端口。

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()

哇,十年过去了:这个答案对我还有用吗?让我们看看。 - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接