【发布时间】:2016-03-08 01:37:49
【问题描述】:
现在我通过本教程编写了 ferver: https://twistedmatrix.com/documents/14.0.0/web/howto/web-in-60/asynchronous-deferred.html 但这似乎只适用于延迟过程,实际上并不能同时处理 2 个或更多请求。我的完整代码是:
from twisted.internet.task import deferLater
from twisted.web.resource import Resource
from twisted.web.server import Site, NOT_DONE_YET
from twisted.internet import reactor, threads
from time import sleep
class DelayedResource(Resource):
def _delayedRender(self, request):
print 'Sorry to keep you waiting.'
request.write("<html><body>Sorry to keep you waiting.</body></html>")
request.finish()
def make_delay(self, request):
print 'Sleeping'
sleep(5)
return request
def render_GET(self, request):
d = threads.deferToThread(self.make_delay, request)
d.addCallback(self._delayedRender)
return NOT_DONE_YET
def main():
root = Resource()
root.putChild("social", DelayedResource())
factory = Site(root)
reactor.listenTCP(8880, factory)
print 'started httpserver...'
reactor.run()
if __name__ == '__main__':
main()
但是当我传递 2 个请求时,控制台输出是这样的:
睡觉
抱歉让您久等了。
睡觉
抱歉让您久等了。
但如果它是并发的,它应该是这样的:
睡觉
睡觉
抱歉让您久等了。
抱歉让您久等了。
所以问题是如何让twisted不等到响应完成后再处理下一步?
make_delayIRL 也是一个具有重逻辑的大型函数。基本上我会产生很多线程并向其他 url 发出请求并收集结果介绍响应,因此可能需要一些时间并且不容易移植
【问题讨论】:
标签: python multithreading http server twisted