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


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)