我正在尝试使用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()
答案 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)。