关于在TCP代理项目中是否使用Twisted的常见问题
我需要写一个简单但有效且可扩展的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),这样你就可以通过命令行工具来调整你的代码,选择最合适的机制,而不需要真的重写代码。