1
est 2013-12-30 15:25:29 +08:00
看文档 `IOLoop.add_timeout` is a non-blocking alternative to `time.sleep
|
2
mengzhuo OP |
3
zenliver 2013-12-31 14:26:28 +08:00
这里的异步是指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 15:58:54 +08:00
你看看Runner的实现,,,一切就明白了
|
6
b1074549 2014-02-13 11:10:46 +08:00
ThreadedResolver
|
7
xunuoi 2015-03-09 11:51:34 +08:00
用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' 此时就是异步非阻塞的实现了(用线程解决的) |
9
fasling 2015-04-28 10:26:42 +08:00
@xunuoi 我也是用了这种方法,但是想在on_finish的时候对query_movie的返回值做做一些别的事情,请问要怎么做?
|