我只是想了解,如果当我调用 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 秒,使整个进程同步)还是协程生成一个新线程?
最佳答案
例子总是最好的:
#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
from __future__ import (absolute_import, division, print_function)
# unicode_literals)
import threading
import time
def func1():
time.sleep(10)
print('Func1: Out of sleep and returning')
def func2(flag):
while not flag:
time.sleep(1)
print('Func2: looping')
print('Func2: Flag set, leaving')
t1 = threading.Thread(target=func1)
f = list()
t2 = threading.Thread(target=func2, kwargs=dict(flag=f))
t1.start()
t2.start()
t1.join()
f.append(None)
输出:
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func2: looping
Func1: Out of sleep and returning
Func2: looping
Func2: Flag set, leaving
从输出中可以明显看出,即使 t1
(第一个线程)在 10
的长时间 time.sleep
内被阻塞秒,第二个线程 t2
正在运行。
甚至当t1
完成时,我们看到主线程能够追加
到用作标志
的列表让 t2
明白它必须返回并因此结束。
所以:time.sleep
只会阻塞正在执行的线程。
关于python - time.sleep() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260178/