Python Twisted多线程TCP代理

时间:2015-02-17 08:21:18

标签: python twisted

我正在尝试使用Python的扭曲框架编写TCP代理。我从Twisted的端口转发示例开始,它似乎在标准的secnario中完成了这项工作。问题是我有一个相当奇特的场景。我们需要的是处理每个TCP数据包并寻找某种模式。

如果模式匹配,我们需要执行某个过程。这个过程需要30-40秒(我知道它不是一个好的设计,但目前的情况就是如此)。麻烦的是,如果这个过程开始,所有其他数据包都会被阻止/停留,直到进程完成。因此,如果有100个实时连接,即使其中一个调用该进程,所有剩余的99个进程都会被卡住。

是否有标准的扭曲'方式,其中每个连接/会话在一个单独的线程中处理,以便“阻止”过程'不介入其他现场连接吗?

示例代码:

from twisted.internet import reactor
from twisted.protocols import portforward
from twisted.internet import threads


def processingOperation(data)
# doing the processing operation here
        sleep(30)
        return data

def server_dataReceived(self, data):

        if data.find("pattern we need to test")<> -1:
                data = processingOperation(data)

        portforward.Proxy.dataReceived(self, data)
portforward.ProxyServer.dataReceived = server_dataReceived

def client_dataReceived(self, data):

        portforward.Proxy.dataReceived(self, data)
portforward.ProxyClient.dataReceived = client_dataReceived
reactor.listenTCP(8383, portforward.ProxyFactory('xxx.yyy.uuu.iii', 80))

reactor.run()

1 个答案:

答案 0 :(得分:1)

原因有。您将处理推迟到一个线程。例如:

def render_POST(self, request):
    # some code you may have to run before processing

    d = threads.deferToThread(method_that_does_the_processing, request)

    return ''

有一个技巧:这将在处理完成之前返回。客户将得到答案。所以你可能想要返回202 / Accepted而不是200 / Ok(或我的假'')。

如果您需要在处理完成后返回,则可以使用内联回拨(http://twistedmatrix.com/documents/10.2.0/api/twisted.internet.defer.inlineCallbacks.html)。