2

我试图将慢速计算放入线程中,并收到错误“Request.write 在调用 Request.finish 后调用请求”。

我已经查看了答案,并找到了完全相同的问题,但该解决方案对我不起作用。请指教。

from twisted.web.server import Site, NOT_DONE_YET
from twisted.web.resource import Resource
from twisted.internet import reactor, threads
from twisted.python import log

import sys
import time


def SlowComputation():
    time.sleep(10)
    return "Lang Computation Result"


def FastComputation():
    return "Fast Computation Result"


class PerformComputation(Resource):
    def Success(self, request):
        request.write('Success')
        request.finish()

    def Failure(self, request):
        request.write('Failure')
        request.finish()

    def render_GET(self, request):
        if 'fast' in request.args:
            d = threads.deferToThread(FastComputation)
            d.addCallback(self.Success(request))
            return NOT_DONE_YET
        if 'slow' in request.args:
            d = threads.deferToThread(SlowComputation)
            d.addCallback(self.Success(request))
            return NOT_DONE_YET


log.startLogging(sys.stdout)
root = Resource()
root.putChild("calculate", PerformComputation())
factory = Site(root)
reactor.listenTCP(8880, factory, interface='localhost')
reactor.run()
4

1 回答 1

3

这:

d.addCallback(self.Success(request))

是相同的:

temp = self.Success(request)
d.addCallback(temp)

其中,给定 的定义与Success以下相同:

request.write('Success')
request.finish()
temp = None
d.addCallback(None)

在调用 Request.finish 后调用 Request.write可能会失败。因为d.addCallback(None)引发异常并且服务器尝试将错误报告为响应。但是,由于finish已经被调用,因此无法写入错误。

Deferred使用额外参数向 a 添加回调的正确方法是d.addCallback(self.Success, request). Deferred 但是,总是将 a 的结果作为第一个参数传递的回调Deferred- 所以正确的签名Success是:

def Success(self, result, request):
    ...
于 2013-10-09T13:14:12.727 回答