时间。睡觉()功能

2024-09-28 17:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道如果我打电话给你时间。睡觉(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秒钟,使整个进程同步)还是协同进程生成一个新线程?在


Tags: 代码httpmessageasyncserverapplicationdef时间
2条回答

龙卷风从不为你制造线索。如果你打电话时间。睡觉,它会在睡眠期间阻塞整个进程;不会继续进行其他处理。这就是为什么文档会说"time.sleep should not be used in coroutines because it is blocking"。要显式暂停协同程序并将控制权返回给IOLoop,以便其他处理可以继续进行,请执行以下操作:

yield gen.sleep(0.5)

*Tornado可以为DNS解析或显式使用ThreadPoolExecutor使任务异步时生成线程。但是你可以忽略这些案例。在

最好的例子是:

#!/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)

带输出:

^{pr2}$

从输出可以明显看出,即使t1(第一个线程)在10秒的长时间time.sleep被阻塞,第二个线程t2仍在运行。在

甚至当t1完成时,我们看到主线程能够append到列表中,该列表被用作flag,让{}理解它必须返回并因此结束。在

所以:time.sleep只阻塞正在执行的线程。在

相关问题 更多 >