在Python中,sleep()和wait()是两种常用的线程同步技术。虽然它们都可以用来控制线程之间的执行顺序,但它们的实现方式和适用场景有所不同。以下是它们的详细对比:
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()
通常与特定的,只能由一个线程写入的共享资源相关。当另一个线程修改了该共享资源后,可以调用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()
是一种线程同步机制,允许一个线程等待并阻塞,直到收到另一个线程发送的通知信号。它适用于控制共享变量的修改。