有关使用或不使用的一般问题在TCP代理项目中使用Twisted

时间:2010-11-04 11:15:19

标签: python sockets proxy twisted

我需要编写简单但有效且可扩展的TCP代理,它可以接受一个I​​P上的连接:PORT并将数据转发给可能有大量客户端侦听其IP:PORT对。

问题是,如果有理由在这里使用Twisted?有没有收获,我现在看不到,但是会看到项目完成吗?我问这个问题,主要是因为Twisted非常复杂,而且它的文档并不是新手友好的 - 我使用纯Python套接字和多进程模块或多或少地完成了代码,并且使用Twisted编写的代码已经让我头疼。

那么,你对此有何看法? Twisted是浪费时间和过度杀伤,还是会带来一些好处(速度,稳健性,可扩展性等)?也许还有其他东西可以更轻松和更成功地使用,比如Gevent或Eventlet框架?

1 个答案:

答案 0 :(得分: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),因此您可以使用命令将代码调整到最合适的机制线工具,而不是必须实际重写代码。