📜  在 python 中等待(1)

📅  最后修改于: 2023-12-03 15:37:27.373000             🧑  作者: Mango

在 Python 中等待

在 Python 中等待是一个非常重要的主题,由于 Python 的异步编程特性和多线程并发执行,等待代码段完成才能继续执行的情况必须得到处理。在这篇文章中,我们将讨论在 Python 中等待的几种方法。

time.sleep()

time.sleep() 函数是一个非常基础的等待方法,它是通过暂停线程执行来模拟等待操作。在等待的时间内,该线程不会去执行任何其他的指令。下面是一个 time.sleep() 的基本使用样例:

import time

print("Start")
time.sleep(5)
print("End")

输出结果如下:

Start
[等待5秒钟]
End

请注意,在这个例子中,等待时间应该是一个整数,单位是秒。

threading.Event()

threading.Event() 是 Python 标准库中一个非常实用的事件处理模块。它允许一个或多个线程等待某些条件的发生,然后一旦满足条件,线程就可以继续执行。它的基础使用方法如下:

import threading

e = threading.Event()

def monitor():
    print("Waiting for the signal")
    e.wait()
    print("Signal arrived")

def trigger():
    print("Triggering the event")
    e.set()

t1 = threading.Thread(target=monitor)
t2 = threading.Thread(target=trigger)

t1.start()
t2.start()

t1.join()
t2.join()

输出结果如下:

Waiting for the signal
[等待]
Triggering the event
Signal arrived

请注意,e.wait() 是一个阻塞操作,它会一直等待,直到 Event 对象被调用 set() 方法,才会继续执行。

asyncio.sleep()

asyncio.sleep() 函数是 Python 3.4 开始引入的异步等待函数。它可以被用来等待其他协程或任务完成的时候,而不是暂停整个线程。下面是一个 asyncio.sleep() 的基本使用样例:

import asyncio

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")
    await say_after(1, 'hello')
    await say_after(2, 'world')
    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

输出结果如下:

started at 20:47:57
[等待1秒钟]
hello
[等待2秒钟]
world
finished at 20:47:59

在这个例子中,我们使用 asyncio.run 函数来简化代码。可以看到,我们不需要使用 await 在 time.sleep() 完成之前暂停执行整个线程。如果需要等待多个协程任务,并希望它们可以并行地执行,可以使用 asyncio.gather() 函数。

Conclusion

在 Python 中等待可能是一项棘手的任务,但是在应对异步编程、多线程并发等复杂程序中是必不可少的。本文提供了 time.sleep(), threading.Event() 和 asyncio.sleep() 等等不同的方案,帮助程序员更好地应对等待问题。