Python多线程基础:Thread类使用与线程状态解析
本文详解Python中多线程的基础概念,重点讲解threading模块中Thread类的用法。通过代码示例演示线程的创建、状态监控(is_alive)及业务函数的绑定与调用。文章澄清了主线程的存在,并解释了多线程执行时的时间打印现象,帮助读者理解并发执行的基本逻辑。
一、什么是线程?
在工厂中,工人们各自独立工作,互不干扰,每个工人都是一个独立运行的单位。
线程的概念与此类似,它是程序中的一个独立运行单位。多线程技术允许多个这样的独立单位同时执行相同的任务或不同的任务。
这种直观的理解有助于后续更深入的对比与分析。
在Python中,threading.Thread 类是Python标准库中用于处理线程的核心类,它封装了线程的相关信息及通用操作方法。
线程拥有生命周期状态,这可以用工人一天的工作流程来类比:从早上上班开始工作,中间可能因各种原因暂停休息,最后下班结束。
请运行以下代码以观察线程的基本行为:
import threading
mythread = threading.Thread()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
mythread.start()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())以下是代码运行后的输出结果:

建议读者亲自运行上述代码,以加深直观印象。
二、再来解释线程的代码
在上述示例中,我们引入了threading库,并创建了Thread类的实例对象,将其赋值给变量mythread。
随后,代码打印了该对象及其is_alive()方法的返回值,用于检查线程是否处于活跃状态。
在调用start()之前,两次打印的结果均为False。
然而,在调用start()方法后,再次打印线程对象时,其状态显示为‘stopped’。
这表明,当我们执行完start方法(即启动线程的函数)后,线程便进入了stopped状态。
前面的示例中线程似乎未执行具体任务,接下来我们将演示如何让线程执行实际业务逻辑。
三、线程触发业务函数,线程调用业务函数
假设我们需要执行的业务逻辑如下:
def dianzan_guanzhu():
now = datetime.datetime.now() #初始化时间变量
name = "python萌新"
print("%s name:%s" % (now, name)) #第一次打印时间和粉丝名字
time.sleep(1)
result = "好棒!" + name + " 关注雷学委,白嫖了好多知识和开发经验!"
print("%s result:%s" % (now, result)) #第二次打印时间和粉丝活动
return result我们可以利用线程来调用该业务函数。下面演示如何编写带参数的函数,并通过线程指定调用参数:
- target:设置为即将被调用的目标函数。
- kwargs:如果目标函数需要参数,可以直接通过传递一个键值对字典(k-v dict)来指定。
def dianzan_guanzhu(name):
#省略一些代码
mythread = threading.Thread(target=dianzan_guanzhu, kwargs={"name": "python萌新"})下面展示完整代码,分别演示通过线程调用和直接调用函数的效果:
请查看以下代码实现:
import threading
import datetime
import time
"""学委定义了一个关注函数"""
def dianzan_guanzhu():
now = datetime.datetime.now()
name = "python萌新"
print("%s name:%s" % (now, name))
time.sleep(1)
result = "好棒!" + name + " 关注雷学委,学到了好多知识和开发经验!"
print("%s result:%s" % (now, result))
return result
mythread = threading.Thread(target=dianzan_guanzhu)
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
mythread.start()
print("mythread:", mythread)
print("is_alive:", mythread.is_alive())
dianzan_guanzhu()
print("is_alive:", mythread.is_alive())复制并运行代码后,可以看到我们的dianzan_guanzhu函数被调用了两次。
第一次调用是通过mythread.start方法触发的。
第二次调用则是直接脱离线程,显式调用dianzan_guanzhu函数。
以下是具体的运行结果:

乍看之下,输出似乎没有明显区别。
请仔细对比每次打印的时间戳,输入的时间顺序似乎出现了“错乱”?这并非显示错误,而是多线程并发执行的正常结果。
原因在于,当进入dianzan_guanzhu函数后,初始化了now变量,该时间值在函数执行期间是固定的。
与此同时,在线程外部直接调用dianzan_guanzhu函数,因此这里实际上是两个线程(主线程和子线程)在同时执行相同的业务逻辑。
四、多了一个线程是哪个?
这里需要补充一个关键概念:当我们编写Python脚本并运行代码时,程序本身就在一个主线程中执行。
此前由于未涉及多线程编程,我们往往忽略了这一事实。
从现在开始,必须明确:每个Python程序运行时,至少存在一个主线程。
回到之前的运行结果,两个线程先后依次调用了业务函数:
- 首先,两个线程先后打印了第一行输出。
- 随后,它们分别休眠了一秒(调用sleep(1))。
- 最后,两个线程又先后依次打印了第二行输出。
五、总结
首先掌握线程的基础知识至关重要。
- 每个程序运行过程中,至少包含一个主线程。
- 若需启动更多线程,请使用
Thread类,并通过target参数绑定业务函数。启动线程需调用start()方法。
到此,关于Python多线程基础及Thread类使用的介绍便告一段落。如需了解更多Python线程相关内容,请搜索本站历史文章或继续浏览后续教程,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













