Python多线程实践:threading模odule详解

1 下载量 72 浏览量 更新于2024-08-31 收藏 61KB PDF 举报
"Python多线程threading模块的使用示例和相关知识" 在Python编程中,`threading`模块是实现多线程的核心模块,它提供了创建和管理线程的功能,是基于更低级别的`thread`模块封装的。多线程能够使程序同时执行多个任务,从而提高程序的效率和响应速度。 ### 多线程执行 在提供的代码示例中,创建了一个名为`thread_test`的函数,然后通过`threading.Thread`创建了五个线程,每个线程的目标函数都是`thread_test`。`target`参数用于指定线程要执行的函数。调用`start()`方法启动线程,使得线程开始执行。在这种情况下,五个线程会被并发地启动,但由于CPU调度的原因,它们可能不会完全同时开始执行。 ```python import threading import time def thread_test(): print("test.") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=thread_test) t.start() ``` ### 查看线程数量 另一段代码展示了如何查看正在运行的线程数。`threading.enumerate()`返回一个包含所有活动线程的列表。在这个例子中,程序会持续检查线程数量,当线程数量减少到1(即主程序线程)时退出循环。 ```python import threading from time import sleep, ctime def a(): for _ in range(3): print("a") sleep(1) def bbbbb(): for _ in range(3): print("bbbbb") sleep(1) if __name__ == '__main__': print(f'---开始---: {ctime()}') t1 = threading.Thread(target=a) t2 = threading.Thread(target=bbbbb) t1.start() t2.start() while True: length = len(threading.enumerate()) print(f'当前运行的线程数为:{length}') if length <= 1: break sleep(0.5) ``` ### 封装`threading.Thread`类 可以创建一个新的类继承自`threading.Thread`,并在新类中重写`run`方法。`run`方法将包含线程需要执行的代码。在下面的示例中,`MyThread`类实现了自定义的线程行为: ```python import threading import time class MyThread(threading.Thread): def run(self): for _ in range(3): time.sleep(1) msg = f"I'm {self.name} @{_}" print(msg) if __name__ == '__main__': t = MyThread() t.start() ``` ### 线程执行顺序 在多线程环境中,线程的执行顺序通常不是固定的,因为线程调度由操作系统决定。Python的GIL(全局解释器锁)确保任何时候只有一个线程在执行Python字节码,即使在多核处理器上也是如此。因此,线程之间的交替执行是随机的,除非使用同步机制(如锁、条件变量等)来控制执行顺序。 ### 线程同步 在多线程编程中,线程同步是一个关键概念,用于确保特定操作按预期顺序执行,避免数据竞争和死锁。`threading`模块提供了一些同步原语,如`Lock`、`RLock`(可重入锁)、`Semaphore`、`Event`等,用于控制线程间的交互。 ### 线程安全 当多个线程访问和修改共享资源时,必须确保线程安全。这意味着需要确保在任何时刻只有一个线程可以访问这些资源。在Python中,可以使用锁和其他同步工具来实现线程安全。 ### 主线程与子线程 主线程是程序开始执行的线程,而子线程是由主线程创建的。默认情况下,主线程会等待所有子线程完成后再结束,除非使用特定的方法(如`join()`)来阻止主线程等待。 总结来说,Python的`threading`模块提供了丰富的功能,允许开发者创建和管理线程,实现并发执行任务。理解线程的基本概念、同步机制以及如何正确使用`threading`模块是编写高效并发代码的关键。