Python并发编程:多线程实战与原理解析

2 下载量 102 浏览量 更新于2024-07-15 收藏 178KB PDF 举报
"Python并发编程是提高程序执行效率的重要手段,多线程是其中的一个方法。在Python中,threading和multiprocessing模块提供了多线程和多进程的支持。本文主要探讨了Python中的多线程编程,包括threading模块的使用、线程的启动方式以及线程与进程的区别。 一、threading模块介绍 threading模块是Python标准库中的一个模块,它提供了一种创建和管理线程的方法。与multiprocessing模块类似,threading模块提供了一个易于使用的接口,允许开发者创建和控制线程。虽然线程在某些场景下能提高程序的并行性,但需要注意的是,由于GIL(全局解释器锁)的存在,Python的多线程在CPU密集型任务上并不能实现真正的并行执行,只能在IO密集型任务中利用线程间的切换提升效率。 二、开启线程的两种方式 1. 方式一:通过直接传递函数和参数给Thread构造函数来创建线程。 ```python from threading import Thread import time def sayhi(name): time.sleep(2) print(f'{name} sayhello') if __name__ == '__main__': t = Thread(target=sayhi, args=('egon',)) t.start() print('主线程') ``` 2. 方式二:通过继承Thread类并重写run方法来创建线程。 ```python from threading import Thread import time class Sayhi(Thread): def __init__(self, name): super().__init__() self.name = name def run(self): time.sleep(2) print(f'{self.name} sayhello') if __name__ == '__main__': t = Sayhi('egon') t.start() print('主线程') ``` 两种方式都能实现相同的效果,选择哪种方式取决于个人喜好和代码组织结构。 三、线程与进程的区别 1. 线程是在同一进程内的并行执行单元,它们共享进程的内存空间,可以快速地进行数据交换,但受GIL限制,无法充分利用多核CPU资源。 2. 进程则是独立的内存空间,每个进程都有自己的GIL,因此在多核CPU环境下,多进程可以实现真正的并行计算,但进程间通信相比线程会更复杂。 示例代码展示了在同一进程中启动线程和子进程的不同: ```python from threading import Thread from multiprocessing import Process import os def work(): print('hello') if __name__ == '__main__': # 在主进程下开启线程 t = Thread(target=work) t.start() print('主线程/主进程') # 在主进程下开启子进程 p = Process(target=work) p.start() print('主线程/主进程') ``` 在这个例子中,启动线程时,`hello`会被立即打印,而启动子进程时,`hello`会在主线程打印后才被执行,这是因为线程是并发执行的,而子进程是并行执行的。 四、线程的生命周期 在Python中,主线程会等待所有非守护线程执行完毕后再结束。守护线程(daemon threads)则会在主进程或主线程结束时被自动销毁,即使它们还没有完成任务。 总结,Python的多线程编程提供了灵活性和便利性,但在CPU密集型任务中可能受限于GIL。理解线程与进程的区别,以及如何正确使用它们,对于优化Python程序的性能至关重要。在实际开发中,应根据任务类型和需求来选择适合的并发模型。