python sleep和wait对比总结

  

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()是一种线程同步机制,允许一个线程等待并阻塞,直到收到另一个线程发送的通知信号。它适用于控制共享变量的修改。
相关文章