1
est 2013 年 12 月 30 日
看文档 `IOLoop.add_timeout` is a non-blocking alternative to `time.sleep
|
3
zenliver 2013 年 12 月 31 日
这里的异步是指io异步, time.sleep()会导致线程sleep, 当然会阻塞线程了, 正如@est所说, tornado有提供这样的功能, 如果你遇到cpu bound问题, 可以用tornado.concurrent.run_on_executor, backend用线程池还是进程池,还是其它什么, 看你想怎么实现了,,,如果仅仅只是想把一个同步的程序变为异步,,,这么做没什么好处,,,,纯粹闲的蛋痛。。。。
|
4
mengzhuo OP @zenliver
不算是闲得慌 关键是js的callback/信号模式还能理解,写点小程序神马的都没问题,到Tornado上就傻眼了,future只是yield出来,后面又可以像同步的方法调用,但实际上又是异步的 OTZ |
5
zenliver 2013 年 12 月 31 日
你看看Runner的实现,,,一切就明白了
|
6
b1074549 2014 年 2 月 13 日
ThreadedResolver
|
7
xunuoi 2015 年 3 月 9 日
用ThreadPoolExecutor来解决,举个例子:
from tornado import gen,web from tornado.concurrent import run_on_executor #if in Python2, it need install by pip install futures from concurrent.futures import ThreadPoolExecutor from model.Movie import Movie class IndexHandler(web.RequestHandler): executor = ThreadPoolExecutor(2) @web.asynchronous @gen.coroutine def get(self): #用yield来返回一个迭代器函数 mov = yield self.query_movie() self.write('llalalal') self.finish() @run_on_executor #此处是耗时的操作 def query_movie(self): time.sleep(5) return 'sleep lallal' 此时就是异步非阻塞的实现了(用线程解决的) |