如何在 python Klein 中设置服务器超时?
How to set the server timeout in python Klein?
我正在使用 python Klein http://klein.readthedocs.io/en/latest/ 来设置网络服务。我已经检查了文档,但我仍然不知道如何设置服务的超时时间。谁能更熟悉工具展示如何将超时设置为 15 秒?谢谢!
您可以调用 Request.loseConnection()
以在设置的超时间隔后断开与客户端的请求连接。这是一个简单的例子:
from twisted.internet import reactor, task, defer
from klein import Klein
app = Klein()
request_timeout = 10 # seconds
@app.route('/delayed/<int:n>')
@defer.inlineCallbacks
def timeoutRequest(request, n):
work = serverTask(n) # work that might take too long
drop = reactor.callLater(
request_timeout, # drop request connection after n seconds
dropRequest, # function to drop request connection
request, # pass request obj into dropRequest()
work) # pass worker deferred obj to dropRequest()
try:
result = yield work # work has completed, get result
drop.cancel() # cancel the task to drop the request connection
except:
result = 'Request dropped'
defer.returnValue(result)
def serverTask(n):
"""
A simulation of a task that takes n number of seconds to complete.
"""
d = task.deferLater(reactor, n, lambda: 'delayed for %d seconds' % (n))
return d
def dropRequest(request, deferred):
"""
Drop the request connection and cancel any deferreds
"""
request.loseConnection()
deferred.cancel()
app.run('localhost', 9000)
要尝试此操作,请转至 http://localhost:9000/delayed/2
,然后转至 http://localhost:9000/delayed/20
以测试任务未及时完成的情况。不要忘记取消与此请求相关的所有任务、延迟、线程等,否则您可能会浪费大量内存。
代码说明
服务器端任务:客户端以指定的延迟值转到/delayed/<n>
端点。服务器端任务 (serverTask()
) 开始,为了简单起见并模拟繁忙的任务,deferLater
用于在 n
秒后 return 字符串。
Request Timeout:使用callLater
函数,在request_timeout
间隔后,调用dropRequest
函数并传request
以及所有需要取消的延期工作(在本例中只有 work
)。当 request_timeout
过去后,请求连接将关闭 (request.loseConnection()
) 并且延迟将被取消 (deferred.cancel
)。
Yield Server Task Result:在 try/except 块中,当值可用时,或者如果超时已过且连接断开,将产生结果, 将发生错误并且 Request dropped
消息将被 returned.
备选
这看起来确实不是一个理想的场景,应该尽可能避免,但我可以看到对这种功能的需求。此外,尽管很少见,但请记住 loseConnection
并不总是完全关闭连接(这是由于 TCP 实现没有那么多 Twisted)。更好的解决方案是在客户端断开连接时取消服务器端任务(这可能更容易捕捉)。这可以通过将 addErrback
附加到 Request.notifyFinish()
来完成。这是一个仅使用 Twisted (http://twistedmatrix.com/documents/current/web/howto/web-in-60/interrupted.html) 的示例。
我正在使用 python Klein http://klein.readthedocs.io/en/latest/ 来设置网络服务。我已经检查了文档,但我仍然不知道如何设置服务的超时时间。谁能更熟悉工具展示如何将超时设置为 15 秒?谢谢!
您可以调用 Request.loseConnection()
以在设置的超时间隔后断开与客户端的请求连接。这是一个简单的例子:
from twisted.internet import reactor, task, defer
from klein import Klein
app = Klein()
request_timeout = 10 # seconds
@app.route('/delayed/<int:n>')
@defer.inlineCallbacks
def timeoutRequest(request, n):
work = serverTask(n) # work that might take too long
drop = reactor.callLater(
request_timeout, # drop request connection after n seconds
dropRequest, # function to drop request connection
request, # pass request obj into dropRequest()
work) # pass worker deferred obj to dropRequest()
try:
result = yield work # work has completed, get result
drop.cancel() # cancel the task to drop the request connection
except:
result = 'Request dropped'
defer.returnValue(result)
def serverTask(n):
"""
A simulation of a task that takes n number of seconds to complete.
"""
d = task.deferLater(reactor, n, lambda: 'delayed for %d seconds' % (n))
return d
def dropRequest(request, deferred):
"""
Drop the request connection and cancel any deferreds
"""
request.loseConnection()
deferred.cancel()
app.run('localhost', 9000)
要尝试此操作,请转至 http://localhost:9000/delayed/2
,然后转至 http://localhost:9000/delayed/20
以测试任务未及时完成的情况。不要忘记取消与此请求相关的所有任务、延迟、线程等,否则您可能会浪费大量内存。
代码说明
服务器端任务:客户端以指定的延迟值转到/delayed/<n>
端点。服务器端任务 (serverTask()
) 开始,为了简单起见并模拟繁忙的任务,deferLater
用于在 n
秒后 return 字符串。
Request Timeout:使用callLater
函数,在request_timeout
间隔后,调用dropRequest
函数并传request
以及所有需要取消的延期工作(在本例中只有 work
)。当 request_timeout
过去后,请求连接将关闭 (request.loseConnection()
) 并且延迟将被取消 (deferred.cancel
)。
Yield Server Task Result:在 try/except 块中,当值可用时,或者如果超时已过且连接断开,将产生结果, 将发生错误并且 Request dropped
消息将被 returned.
备选
这看起来确实不是一个理想的场景,应该尽可能避免,但我可以看到对这种功能的需求。此外,尽管很少见,但请记住 loseConnection
并不总是完全关闭连接(这是由于 TCP 实现没有那么多 Twisted)。更好的解决方案是在客户端断开连接时取消服务器端任务(这可能更容易捕捉)。这可以通过将 addErrback
附加到 Request.notifyFinish()
来完成。这是一个仅使用 Twisted (http://twistedmatrix.com/documents/current/web/howto/web-in-60/interrupted.html) 的示例。