我只是想弄明白,如果我调用time.sleep(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将是一个单线程服务器,那么time.sleep(5)在这种情况下究竟做了什么(它只是阻塞线程5秒钟,使整个进程同步),还是协程产生一个新线程?
4条答案
按热度按时间j13ufse21#
举个例子总是最好的:
输出:
从输出中可以明显看出,即使
t1
(第一个线程)在10
秒的time.sleep
长时间内被阻塞,第二个线程t2
仍在运行。甚至当
t1
完成时,我们看到主线程能够将append
添加到用作flag
的列表中,以让t2
知道它必须返回并因此结束。因此:
time.sleep
只阻塞正在其中执行的线程。lmvvr0a82#
Tornado从不为你生成线程。* 如果你调用time.sleep,它会在睡眠期间阻塞整个进程;没有其他处理继续进行。2这就是为什么文档说“time.sleep不应该在协程中使用,因为它阻塞了”。3要显式暂停协程并将控制返回IOLoop,以便其他处理可以继续进行:
jw5wzhpr3#
yeotifhr4#