【问题标题】:Python Twisted multithreaded TCP proxyPython Twisted 多线程 TCP 代理
【发布时间】:2015-02-17 08:21:18
【问题描述】:

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

如果模式匹配我们需要做一个特定的过程。这个过程需要 30-40 秒(我知道这不是一个好的设计,但目前情况就是这样)。问题是,如果这个过程开始,所有其他数据包都会被阻止/卡住,直到过程完成。因此,如果有 100 个实时连接,即使其中 1 个调用该进程,所有剩余的 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()

【问题讨论】:

    标签: python twisted


    【解决方案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)。

    【讨论】:

    • 谢谢克劳斯,我正在调查这个,虽然我试过一次延期但不是专家。我正在做。同时,我发布了我正在使用的示例 portforward 代码。如您所见,我正在根据模式匹配调用 processingOperation。也许我要求的太多了,但你能给出一些关于这段代码上下文的指针吗?就像内联调用的确切位置一样?
    • 你不需要 inlineCallbacks。如果你想在一个线程中运行一些代码,你只需要 deferToThread。
    • 感谢 Klaus 和 Jean-Paul deferToThread 成功了。然而,我确实对数据在各种调用之间的流动方式以及我如何返回处理后的值进行了一些挣扎,但最终它奏效了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2018-01-23
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多