python - time.sleep() 函数

标签 python tornado

我只是想了解,如果当我调用 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/

相关文章:

python - 在 TreeView 上添加默认过滤器 - OpenErp 自定义模块

Python 2D 绘图为 3D (Matplotlib)

python - 获取原始输入作为选项?

python - Tornadio2 + Socket.io 负载测试

python - Tornado 中的下载功能?

python - 取两个向量列表的 "element-wise"点积比 numpy.einsum 更快的替代方法?

Python 包 "No module named..."

python - 如何格式化日志记录级别的名称

asynchronous - 如何在 Tornado 中将异步函数和生成函数包装在一起?

python - Tornadoweb webapp 无法通过 upstart 进行管理