Python线程深入解析:函数与类的使用

0 下载量 122 浏览量 更新于2024-09-04 收藏 63KB PDF 举报
"这篇文章主要介绍了Python中创建线程的两种方式——函数式和类式,并通过实例详细解析了如何创建和使用线程。" 在Python编程中,线程是实现多任务并行处理的一种机制。这使得程序可以在执行过程中同时进行多个不同的任务,提高效率。本文将深入探讨Python中线程的创建与使用。 1. 线程的创建 Python提供了两种创建线程的方法: - 函数式创建:借助于`_thread`模块的`start_new_thread()`函数。不过在实际开发中,更推荐使用`threading`模块,因为它的功能更加强大且易于使用。 ```python import threading import time def foo(n): time.sleep(n) print("foofunc:", n) def bar(n): time.sleep(n) print("barfunc:", n) s1 = time.time() t1 = threading.Thread(target=foo, args=(3,)) t1.start() # 启动线程t1 t2 = threading.Thread(target=bar, args=(5,)) t2.start() # 启动线程t2 print("ending") s2 = time.time() print("costtime:", s2 - s1) ``` 在上述代码中,我们首先定义了两个函数`foo`和`bar`,然后创建了两个线程实例`t1`和`t2`,分别对应这两个函数。通过`start()`方法启动线程,主程序会立即执行下一行代码,不会等待线程执行完毕。因此,主线程会先打印"ending",然后计算总耗时,最后线程`t1`和`t2`会按照各自的延迟时间依次打印。 - 类式创建:通过继承`threading.Thread`类来创建自定义线程。重写`run()`方法来定义线程要执行的任务。 ```python import threading import time class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print("ok") time.sleep(2) print("endt1") t = MyThread() t.start() ``` 在这个例子中,我们创建了一个名为`MyThread`的类,它继承自`threading.Thread`。在`run()`方法中定义了线程的行为。创建`MyThread`实例后,调用`start()`方法启动线程。 2. 线程的特性 - GIL(全局解释器锁):Python的多线程并不能实现真正的并行计算,因为存在全局解释器锁,同一时刻只有一个线程能执行Python字节码。这对于CPU密集型任务来说,多线程可能无法充分利用多核优势。但对I/O密集型任务(如网络请求、文件读写等),由于I/O操作会释放GIL,线程间可以交替执行,仍然能提升性能。 - 线程同步:为了防止线程间的资源竞争,Python提供了多种同步机制,如`Lock`、`Semaphore`、`Condition`等,用于控制对共享资源的访问。 - 线程优先级:Python的线程没有内置的优先级设置,所有线程默认平等对待。但在某些操作系统上,可以通过其他方式设置线程优先级。 - 线程池:`threading`模块提供了`ThreadPoolExecutor`类,可以预先创建一定数量的线程,方便管理和调度。 理解并熟练掌握Python中的线程机制对于编写高效并发程序至关重要。无论是通过函数还是类的方式创建线程,都需要根据具体需求选择合适的方法,并考虑线程同步、资源管理等因素,以确保程序的正确性和性能。