Python多线程基础:threading模块与子线程创建详解
本文详解Python多线程编程核心概念,重点解析CPython中GIL对多线程效率的影响及IO密集型场景的优势。文章提供了两种使用threading模块创建子线程的实用方法:通过函数target参数指定任务,以及通过继承Thread类重写run方法。包含完整代码示例与运行结果分析,帮助开发者掌握Python并发编程基础。
Python多线程与GIL概述
本文详细介绍Python中多线程的实现机制,重点讲解threading模块的使用,并演示创建子线程的两种常见方式,供读者参考学习。
在C语言版本的Python解释器中,存在GIL(全局解释器锁)。GIL导致同一时刻只能有一个线程执行字节码,从而降低了多线程的性能表现(即哪个线程获取到锁,就由哪个线程执行)。然而,在IO密集型程序中,由于IO阻塞期间GIL会自动释放并切换线程,多线程依然比单线程具有更高的效率。
针对GIL带来的限制,主要有以下三种解决思路:
1. 避免使用C语言版本的Python解释器(如改用Jython或IronPython,但通常不推荐)。 2. 让子线程执行其他语言编写的代码(例如主线程使用Python,子线程调用C语言编写的动态库)。 3. 采用多进程替代多线程,因为多进程可以充分利用多核CPU资源。
通过函数创建子线程
创建子线程的第一种方法是通过函数指定任务。
具体实现代码见demo.py(通过函数名指定子线程的任务):
import threading
def test1():
print("子线程运行了...")
def main():
# 通过 target=函数名 的方式定义子线程
t1 = threading.Thread(target=test1) # 通过target指定子线程要执行的任务。可以通过args=元组 来指定test1的参数。
t1.start() # 只有在调用start方法后才会创建子线程并执行
# threading.enumerate() 打印正在执行的线程,包括主线程和子线程
print(threading.enumerate()) # [<_MainThread(MainThread, started 139724821161728)>, <Thread(Thread-1, started 139724795434752)>]
# 当子线程没有结束时,主线程也不会结束。 当主线程结束后,所有的子线程也会结束。
if __name__ == "__main__":
main()
程序运行后的输出结果如下:
子线程运行了... [<_MainThread(MainThread, started 7076)>, <Thread(Thread-1, started 2832)>]
通过类继承创建子线程
创建子线程的第二种方法是通过自定义类来实现。
具体实现代码见demo.py(通过类来定义子线程):
#coding=utf-8
import threading
# 通过类定义子线程。 继承threading.Thread类
class MyThread(threading.Thread):
# 开启子线程时,会自动执行run函数
def run(self):
print(self.name) # Thread-1 name属性中保存的是当前线程的名字
def main():
t = MyThread() # 实例化自定义的子线程
t.start() # 开启子线程
if __name__ == '__main__':
main()
该方式的运行结果如下:
Thread-1
更多关于Python并发编程及相关技术的内容,感兴趣的读者可参考本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》。
希望本文提供的示例和解析能对大家的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









