在 Python 中,当 Python 解释器被执行时启动的初始线程称为主线程。它是 Python 进程内的默认线程,负责管理程序和创建额外的线程。每一个 Python 程序至少有一个名为主线程的执行线程。
默认情况下,主线程是非守护线程。在本教程中,您将看到关于 Python 编程中主线程的详细解释及相关示例。
访问主线程
Python 中的 threading 模块提供了访问线程的功能。以下是主要的功能:
-
threading.current_thread()
:此函数返回一个代表当前线程的 threading.Thread
实例。
-
threading.main_thread()
:返回一个代表主线程的 threading.Thread
实例。
示例
threading.current_thread()
函数返回一个代表当前线程的 threading.Thread
实例。下面是一个示例。
import threading
name = 'Tutorialspoint'
print('Output:', name)
print(threading.current_thread())
它将产生如下输出:
Output: Tutorialspoint
<_MainThread(MainThread, started 140260292161536)>
示例
这个示例演示了如何使用 threading.main_thread()
函数来获取主线程的引用。同时,它也展示了主线程与其他线程的区别,使用 threading.current_thread()
函数。
import threading
import time
def func(x):
time.sleep(x)
if not threading.current_thread() is threading.main_thread():
print('threading.current_thread() not threading.main_thread()')
t = threading.Thread(target=func, args=(0.5,))
t.start()
print(threading.main_thread())
print("Main thread finished")
当上面的代码被执行时,它会产生如下结果:
<_MainThread(MainThread, started 140032182964224)>
Main thread finished
threading.current_thread() not threading.main_thread()
Python 中主线程的行为
主线程将在其完成执行脚本中未在单独线程中启动的所有代码时退出。例如,当你使用 start()
方法启动一个新的线程时,主线程将继续执行脚本中的剩余代码,直到到达末尾然后退出。
由于其他线程默认是以非守护模式启动的,因此即使主线程已经退出,它们也会继续运行直到完成。
示例
下面的示例展示了 Python 多线程程序中的主线程行为。
import threading
import time
def func(x):
print('Current Thread Details:', threading.current_thread())
for n in range(x):
print('Internal Thread Running', n)
print('Internal Thread Finished...')
t = threading.Thread(target=func, args=(6,))
t.start()
for i in range(3):
print('Main Thread Running', i)
print("Main Thread Finished...")
它将产生如下输出:
Current Thread Details: Thread(Thread-1 (func), started 140562647860800)
Main Thread Running 0
Internal Thread Running 0
Main Thread Running 1
Main Thread Running 2
Internal Thread Running 1
Main Thread Finished...
Internal Thread Running 2
Internal Thread Running 3
Internal Thread Running 4
Internal Thread Running 5
Internal Thread Finished...
上述代码在不同的运行和不同的编译器下可能会产生不同的输出。
主线程等待其他线程
为了确保主线程等待所有其他线程完成,您可以使用 join()
方法来加入线程。通过使用 join()
方法,您可以控制执行流程,并确保主线程在退出之前正确地等待所有其他线程完成他们的任务。这有助于有效地管理 Python 多线程程序中的线程生命周期。
示例
这个示例演示了如何适当地管理主线程以确保在工作线程完成任务之前主线程不会退出。
from threading import Thread
from time import sleep
def my_function_1():
print("Worker 1 started")
sleep(1)
print("Worker 1 done")
def my_function_2(main_thread):
print("Worker 2 waiting for Worker 1 to finish")
main_thread.join()
print("Worker 2 started")
sleep(1)
print("Worker 2 done")
worker1 = Thread(target=my_function_1)
worker2 = Thread(target=my_function_2, args=(worker1,))
worker1.start()
worker2.start()
for num in range(6):
print("Main thread is still working on task", num)
sleep(0.60)
worker1.join()
print("Main thread Completed")
当上面的代码被执行时,它会产生如下结果:
Worker 1 started
Worker 2 waiting for Worker 1 to finish
Main thread is still working on task 0
Main thread is still working on task 1
Worker 1 done
Worker 2 started
Main thread is still working on task 2
Main thread is still working on task 3
Worker 2 done
Main thread is still working on task 4
Main thread is still working on task 5
Main thread Completed