python sleep和wait对比总结

2023-12-16Python编程
18

Python中的sleep和wait对比总结

在Python中,sleep()和wait()是两种常用的线程同步技术。虽然它们都可以用来控制线程之间的执行顺序,但它们的实现方式和适用场景有所不同。以下是它们的详细对比:

sleep

sleep()是一个让线程进入休眠状态的函数,它可以暂停指定时间的线程,让其他线程有机会得到执行。在指定时间内,当前线程会释放GIL锁,其他线程可以得到执行,直到休眠时间到达后,当前线程被重新唤醒。

sleep()的语法如下:

import time

time.sleep(sec)

其中sec参数是指休眠时间,以秒为单位。

以下是一个示例,展示如何使用sleep()函数控制子线程和主线程的执行顺序。

import threading
import time

def worker():
    print("Worker started")
    time.sleep(2) # 子线程休眠2秒
    print("Worker finished")

print("Main started")
t = threading.Thread(target=worker) # 创建子线程
t.start() # 启动子线程
time.sleep(1) # 主线程休眠1秒
print("Main finished")

在上面的示例中,主线程先启动子线程,然后休眠1秒钟,最后才完成。因为主线程休眠了1秒钟,所以子线程有足够的时间执行完毕。如果不加休眠,则主线程会立即结束,子线程没有机会执行完毕。

wait

wait()是一种同步机制,它允许一个线程等待并阻塞它,直到收到另一个线程发送的通知信号。wait()通常与特定的,只能由一个线程写入的共享资源相关。当另一个线程修改了该共享资源后,可以调用notify()notifyAll()方法通知所有等待的线程继续执行。

wait()方法的语法如下:

condition.wait(timeout=None)

其中,condition是一个条件对象,timeout是一个可选的参数,表示在等待操作时的超时时间。

以下是一个简单的示例,展示如何使用wait()notify()方法同步多个线程:

import threading

class Example:
    def __init__(self):
        self.condition = threading.Condition()
        self.counter = 0

    def sub(self):
        with self.condition:
            while self.counter <= 0:
                self.condition.wait() # 等待并阻塞
            self.counter -= 1
            print("Sub: ", self.counter)

    def add(self):
        with self.condition:
            self.counter += 1
            print("Add: ", self.counter)
            self.condition.notify() # 通知等待中的线程继续执行


e = Example()
t1 = threading.Thread(target=e.sub) # 创建子线程1
t2 = threading.Thread(target=e.sub) # 创建子线程2
t3 = threading.Thread(target=e.add) # 创建子线程3

t1.start() # 启动子线程1
t2.start() # 启动子线程2
t3.start() # 启动子线程3

# 等待所有子线程执行完毕
t1.join()
t2.join()
t3.join()

在上面的示例中,有一个共享变量counter,当counter的值大于0时,sub()方法可以执行减法操作,而counter的值被add()方法加1。当counter为0时,sub()方法调用wait()方法将自己挂起,并等待add()方法通知它继续执行。

对比总结

  • sleep()是一种让线程进入休眠状态,暂停指定时间的线程,让其他线程有机会得到执行。它适用于控制线程的执行时间。
  • wait()是一种线程同步机制,允许一个线程等待并阻塞,直到收到另一个线程发送的通知信号。它适用于控制共享变量的修改。
The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103