Twisted Web 服务器:发送响应后执行延迟操作
Twisted web server: execute a deferred action after sending response
我有一个简单的网络服务定义为:
from twisted.internet import endpoints
from twisted.internet import reactor
from twisted.web import resource
from twisted.web import server
class TestService(resource.Resource):
def render_GET(self, request):
return "ok"
ts = TestService()
endpoints.serverFromString(reactor, "tcp:{}".format(8080)).listen(server.Site(ts))
reactor.run()
此服务总是在每个 GET 请求上发送 ok。
很好。
但是我需要在处理请求 1 分钟后执行延迟操作。
我该怎么做?
我的意思是这样的:
from twisted.internet import endpoints
from twisted.internet import reactor
from twisted.web import resource
from twisted.web import server
def deferred_action():
time.sleep(60)
# do some action...
print("action completed")
class TestService(resource.Resource):
def render_GET(self, request):
defer(deferred_action) # how do I do this?
return "ok"
ts = TestService()
endpoints.serverFromString(reactor, "tcp:{}".format(8080)).listen(server.Site(ts))
reactor.run()
可以使用反应堆的callLater()
方法:
reactor.callLater(60.0, deferred_action)
您还可以添加更多参数,然后将这些参数传递给 deferred_action
函数。当然需要接受它们。
def deferred_action(value):
print(value)
class TestService(resource.Resource):
def render_GET(self, request):
reactor.callLater(60.0, deferred_action, 'some value')
我有一个简单的网络服务定义为:
from twisted.internet import endpoints
from twisted.internet import reactor
from twisted.web import resource
from twisted.web import server
class TestService(resource.Resource):
def render_GET(self, request):
return "ok"
ts = TestService()
endpoints.serverFromString(reactor, "tcp:{}".format(8080)).listen(server.Site(ts))
reactor.run()
此服务总是在每个 GET 请求上发送 ok。
很好。
但是我需要在处理请求 1 分钟后执行延迟操作。
我该怎么做?
我的意思是这样的:
from twisted.internet import endpoints
from twisted.internet import reactor
from twisted.web import resource
from twisted.web import server
def deferred_action():
time.sleep(60)
# do some action...
print("action completed")
class TestService(resource.Resource):
def render_GET(self, request):
defer(deferred_action) # how do I do this?
return "ok"
ts = TestService()
endpoints.serverFromString(reactor, "tcp:{}".format(8080)).listen(server.Site(ts))
reactor.run()
可以使用反应堆的callLater()
方法:
reactor.callLater(60.0, deferred_action)
您还可以添加更多参数,然后将这些参数传递给 deferred_action
函数。当然需要接受它们。
def deferred_action(value):
print(value)
class TestService(resource.Resource):
def render_GET(self, request):
reactor.callLater(60.0, deferred_action, 'some value')