我有一个龙卷风的应用程序,我想用一个堵库有所建树。 在它不可能改写库异步方式的情况下,什么是在龙卷风来执行它的方式吗?
例如,我希望能够把一个@asynchronous
装饰上一个请求处理程序,在它启动一些长期运行的功能,一旦完成,将刚刚返回响应。 我不能只是把一个回调。 最简单的例子当然是什么10秒不阻塞龙卷风唯一的线程睡眠的正确方法?
我有一个龙卷风的应用程序,我想用一个堵库有所建树。 在它不可能改写库异步方式的情况下,什么是在龙卷风来执行它的方式吗?
例如,我希望能够把一个@asynchronous
装饰上一个请求处理程序,在它启动一些长期运行的功能,一旦完成,将刚刚返回响应。 我不能只是把一个回调。 最简单的例子当然是什么10秒不阻塞龙卷风唯一的线程睡眠的正确方法?
这似乎是我想要的是简单的创建一个新的线程/进程,这需要与做回调到龙卷风的实际行为IOLoop.instance().add_callback
更多信息,请点击这里
接受的答案是指代码可以用SO 。
另一种方法是在博客中详细介绍在这里 ,随着一个完整的工作要点 。 下面是从主旨代码的重新发布:
from concurrent.futures import ThreadPoolExecutor
from functools import partial, wraps
import time
import tornado.ioloop
import tornado.web
EXECUTOR = ThreadPoolExecutor(max_workers=4)
def unblock(f):
@tornado.web.asynchronous
@wraps(f)
def wrapper(*args, **kwargs):
self = args[0]
def callback(future):
self.write(future.result())
self.finish()
EXECUTOR.submit(
partial(f, *args, **kwargs)
).add_done_callback(
lambda future: tornado.ioloop.IOLoop.instance().add_callback(
partial(callback, future)))
return wrapper
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world %s" % time.time())
class SleepHandler(tornado.web.RequestHandler):
@unblock
def get(self, n):
time.sleep(float(n))
return "Awake! %s" % time.time()
class SleepAsyncHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self, n):
def callback(future):
self.write(future.result())
self.finish()
EXECUTOR.submit(
partial(self.get_, n)
).add_done_callback(
lambda future: tornado.ioloop.IOLoop.instance().add_callback(
partial(callback, future)))
def get_(self, n):
time.sleep(float(n))
return "Awake! %s" % time.time()
application = tornado.web.Application([
(r"/", MainHandler),
(r"/sleep/(\d+)", SleepHandler),
(r"/sleep_async/(\d+)", SleepAsyncHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
试试下面这个例子。
import tornado.ioloop
import tornado.web
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self, request):
if request is None:
self.application.go = False
self.write("Waiting for GET @ http://localhost:8888/go...<br>")
self.flush()
self._do_wait()
else:
self.application.go = True
self.finish('Thanks!')
def _do_wait(self, timeout_trys=10):
if self.application.go:
self.write('Finish')
self.finish()
else:
self.write("Sleeping 2 second, timeout_trys=%s<br>" % timeout_trys)
self.flush()
tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 2,
lambda: self._do_wait(timeout_trys-1))
application = tornado.web.Application([
(r"/(\w+)?", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()