Python 线程的暂停、恢复、退出详解及实例
线程的暂停
在 Python 中,线程的暂停可以通过 sleep 函数实现。sleep 函数的作用是让线程进入休眠状态,等待一定的时间之后再恢复执行。
示例一
下面是一个简单的例子,演示了如何使用 sleep 函数实现线程的暂停。
import threading
import time
def task():
print('Start task...')
time.sleep(5)
print('Task finished.')
t = threading.Thread(target=task)
t.start()
print('Main thread...')
time.sleep(2)
t.join()
在上面的例子中,我们创建了一个名为 task 的函数,里面包含了一个 print 语句和一个 sleep 函数。然后,我们使用 threading 模块创建了一个线程,并让它执行 task 函数。
在主线程中,我们也使用了 sleep 函数,让主线程休眠 2 秒。最后,我们调用了线程的 join 方法,等待线程执行并结束。运行上面的代码,可以看到如下输出结果:
Main thread...
Start task...
Task finished.
可以看到,线程开始执行后,会等待 5 秒钟,然后才会结束。主线程也在执行过程中暂停了 2 秒钟,最后等待线程结束。
线程的恢复
在 Python 中,线程的恢复是自动完成的。一旦线程进入了休眠状态,等待时间结束之后,线程会自动恢复执行。
示例二
下面是一个稍微复杂一些的例子,演示了如何在多个线程之间共享数据,并使用事件对象控制线程的执行流程。
import threading
import time
event = threading.Event()
count = 0
def worker():
global count
print('Worker start...')
while True:
if event.is_set():
count += 1
print('Worker count: %d' % count)
else:
print('Worker paused.')
time.sleep(1)
t = threading.Thread(target=worker)
t.start()
while True:
cmd = input('Enter command:')
if cmd == 'q':
event.set()
t.join()
break
elif cmd == 'p':
event.clear()
print('Paused.')
elif cmd == 'r':
event.set()
print('Resumed.')
else:
print('Unknown command.')
在上面的例子中,我们创建了一个名为 worker 的函数,表示工作线程。在工作线程中,我们使用了一个 while 循环,这个循环在等待一个事件对象的设置,如果事件对象被设置,那么就会累加一个计数器变量,然后输出计数器的值。
在主线程中,我们用一个 while 循环读取用户的输入。如果用户输入 'q',那么就会设置事件对象并等待工作线程结束。如果用户输入 'p',那么就会清除事件对象,让工作线程暂停执行。如果用户输入 'r',那么就会设置事件对象,让工作线程继续执行。运行上面的代码,可以看到如下输出结果:
Worker start...
Enter command:r
Resumed.
Worker count: 1
Worker count: 2
Enter command:p
Paused.
Worker paused.
Enter command:r
Resumed.
Worker count: 3
Worker count: 4
Enter command:q
可以看到,工作线程开始执行后会输出一些内容。在主线程中,我们输入 'r' 使工作线程恢复执行,然后输出了两个计数器的值。接着,我们输入 'p' 使工作线程暂停执行,然后输出了一条提示信息。最后,我们输入 'r' 使工作线程恢复执行,然后输出了另外两个计数器的值。最后,我们输入 'q' 退出程序。