线程对象在其生命周期中会经历不同的阶段。当创建一个新的线程对象时,必须通过调用其 run()
方法来启动它。此方法包含了由新线程执行的过程逻辑。当 run()
方法结束时,线程完成其任务并与主线程合并。
当线程正在运行时,可能会因为预定义的持续时间或等待某个事件的发生而暂停。在线程指定的间隔或过程结束后,线程将继续运行。
Python 中线程生命周期的状态
以下是 Python 线程生命周期的各个阶段:
-
创建线程 — 在 Python 中创建一个新线程,通常使用 threading 模块中的 Thread 类。
-
启动线程 — 一旦线程对象被创建,必须通过调用其
start()
方法来启动它。这会启动线程的活动并在单独的线程中调用其 run()
方法。
-
暂停/阻塞状态 — 线程可能因各种原因而被暂停或阻塞,例如等待 I/O 操作完成或其他线程执行任务。这通常是通过调用其
join()
方法来管理的。这会阻塞调用线程直到被加入的线程终止。
-
同步线程 — 同步确保线程之间的有序执行和共享资源管理。这可以通过使用像锁、信号量或条件变量这样的同步原语来完成。
-
终止 — 当线程的
run()
方法完成执行,无论是通过完成其任务还是遇到异常,线程就会终止。
示例:Python 线程生命周期演示
下面的示例通过展示线程的创建、启动、执行以及与主线程同步来演示 Python 中的线程生命周期。
import threading
def func(x):
print('当前线程详情:', threading.current_thread())
for n in range(x):
print('{} 运行'.format(threading.current_thread().name), n)
print('内部线程完成...')
t1 = threading.Thread(target=func, args=(2,))
t2 = threading.Thread(target=func, args=(3,))
print('线程状态: 创建')
t1.start()
t2.start()
t1.join()
t2.join()
print('线程状态: 完成')
for i in range(3):
print('主线程运行', i)
print("主线程完成...")
当上述代码被执行时,会产生以下输出:
线程状态: 创建
当前线程详情: <Thread(Thread-1 (func), started 140051032258112)>
Thread-1 (func) 运行 0
Thread-1 (func) 运行 1
内部线程完成...
当前线程详情: <Thread(Thread-2 (func), started 140051023865408)>
Thread-2 (func) 运行 0
Thread-2 (func) 运行 1
Thread-2 (func) 运行 2
内部线程完成...
线程状态: 完成
主线程运行 0
主线程运行 1
主线程运行 2
主线程完成...
示例:使用同步原语
下面是一个使用信号量来演示 Python 中线程生命周期的例子,包括创建、启动、运行和终止状态,以及同步。
import threading
import time
semaphore = threading.Semaphore(2)
def worker():
with semaphore:
print('{} 已开始工作'.format(threading.current_thread().name))
time.sleep(2)
print('{} 已完成工作'.format(threading.current_thread().name))
threads = []
for i in range(5):
t = threading.Thread(target=worker, name='Thread-{}'.format(i+1))
threads.append(t)
print('{} 已创建'.format(t.name))
t.start()
for t in threads:
t.join()
print('{} 已终止'.format(t.name))
print('线程状态: 全部完成')
print("主线程完成...")
当上述代码被执行时,会产生以下输出:
Thread-1 已创建
Thread-1 已开始工作
Thread-2 已创建
Thread-2 已开始工作
Thread-3 已创建
Thread-4 已创建
Thread-5 已创建
Thread-1 已完成工作
Thread-2 已完成工作
Thread-3 已开始工作
Thread-1 已终止
Thread-2 已终止
Thread-4 已开始工作
Thread-3 已完成工作
Thread-5 已开始工作
Thread-3 已终止
Thread-4 已完成工作
Thread-4 已终止
Thread-5 已完成工作
Thread-5 已终止
线程状态: 全部完成
主线程完成...