关于在TCP代理项目中是否使用Twisted的常见问题

1 投票
1 回答
975 浏览
提问于 2025-04-16 06:33

我需要写一个简单但有效且可扩展的TCP代理,它可以在一个IP和端口上接受连接,并将数据转发给可能有很多客户端的IP和端口。

我的问题是,使用Twisted是否有必要?我现在看不出有什么好处,但完成项目后会不会有收获?我之所以问这个问题,主要是因为Twisted非常复杂,而且它的文档对新手不太友好。我用纯Python的套接字和多进程模块大致完成了代码,而用Twisted写同样的东西让我头疼不已。

那么,你们怎么看?Twisted是浪费时间和过于复杂,还是会带来一些好处(比如速度、稳定性、可扩展性等等)?也许还有其他更简单且同样有效的框架,比如Gevent或Eventlet?

1 个回答

4

Twisted会让你的代码变得更简单,因为它已经为你做了很多工作。例如,这里有一个使用Twisted的回声服务器:

from twisted.internet.protocol import Protocol
class Echo(Protocol):
    def dataReceived(self, data):
        self.transport.write(data)

还有一个轮询的TCP负载均衡器(虽然没测试过,但应该差不多正确):

from twisted.internet.protocol import Factory
from twisted.protocols.portforward import ProxyServer, ProxyFactory
class Balancer(Factory):
    def __init__(self, hostports):
        self.factories = []
        for (host, port) in hostports:
            self.factories.append(ProxyFactory(host, port))
    def buildProtocol(self, addr):
        nextFactory = self.factories.pop(0)
        self.factories.append(nextFactory)
        return nextFactory.buildProtocol(addr)

你现有的多进程代码是不是这么简单?

如果是的话,还有一点要注意,Twisted可以和特定平台的扩展机制一起工作(比如在MacOS/BSD上用kqueue,在Linux上用epoll,在Win32上用IOCP),这样你就可以通过命令行工具来调整你的代码,选择最合适的机制,而不需要真的重写代码。

撰写回答