我只是想知道如果我打电话给你时间。睡觉(x) ,则运行代码的当前线程将延迟x秒。但是这是在x秒内释放处理器,还是线程将资源保留在自己身上,在x秒之后它就开始执行下一行代码了。在
使用我所面临的确切场景进行编辑:
我的情况是这样的:
class SomeHandler(tornado.websocket.WebSocketHandler)
@tornado.gen.coroutine
def something_async():
time.sleep(5)
return result
def on_message(message):
future = yield something_async(message)
if __name__ == '__main__':
application = tornado.web.Application([
(r'/', SomeHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
既然这个Tornado将是一个单线程服务器,那么它到底做什么呢时间。睡觉(5) 在这种情况下(它只是阻塞线程5秒钟,使整个进程同步)还是协同进程生成一个新线程?在
龙卷风从不为你制造线索。如果你打电话时间。睡觉,它会在睡眠期间阻塞整个进程;不会继续进行其他处理。这就是为什么文档会说"time.sleep should not be used in coroutines because it is blocking"。要显式暂停协同程序并将控制权返回给IOLoop,以便其他处理可以继续进行,请执行以下操作:
*Tornado可以为DNS解析或显式使用ThreadPoolExecutor使任务异步时生成线程。但是你可以忽略这些案例。在
最好的例子是:
带输出:
^{pr2}$从输出可以明显看出,即使
t1
(第一个线程)在10
秒的长时间time.sleep
被阻塞,第二个线程t2
仍在运行。在甚至当}理解它必须返回并因此结束。在
t1
完成时,我们看到主线程能够append
到列表中,该列表被用作flag
,让{所以:
time.sleep
只阻塞正在执行的线程。在相关问题 更多 >
编程相关推荐