【18.5 python中创建线程】
python中创建线程
在Python中,创建线程主要通过threading
模块来实现。这个模块提供了两种主要的方式来创建线程:直接使用threading.Thread
类,以及通过继承threading.Thread
类并覆写其run
方法来创建自定义的线程类。下面分别介绍这两种方法。
1. 使用threading.Thread
模块创建线程
这是最直接且常用的方法。你只需创建一个threading.Thread
的实例,并将要在线程中执行的函数作为target
参数传递给构造函数。然后,调用该实例的start()
方法来启动线程。
import threading
import time# 定义要在线程中执行的函数
def worker(num):"""线程工作函数"""print(f'Worker: {num}')time.sleep(2) # 模拟耗时操作print(f'Worker {num} finished')# 创建线程
t1 = threading.Thread(target=worker, args=(1,))
t2 = threading.Thread(target=worker, args=(2,))# 启动线程
t1.start()
t2.start()# 等待线程完成(实际上在这个简单的例子中,主线程在启动两个子线程后就会立即继续执行,直到脚本结束)
# 在实际应用中,你可能需要在这里加入一些逻辑来等待所有线程完成,比如使用t1.join()和t2.join()
2. 使用Thread
子类创建线程
另一种方法是通过继承threading.Thread
类来创建自定义的线程类。在这个自定义类中,你需要覆写(override)run
方法,该方法将包含线程执行时应当执行的代码。然后,你可以创建这个类的实例并调用其start()
方法来启动线程。
import threading
import time# 继承自threading.Thread的自定义线程类
class MyThread(threading.Thread):def __init__(self, num):super().__init__() # 调用父类的初始化方法self.num = numdef run(self):"""线程执行的代码放在这里"""print(f'Starting MyThread: {self.num}')time.sleep(2) # 模拟耗时操作print(f'MyThread {self.num} finished')# 创建自定义线程类的实例
t1 = MyThread(1)
t2 = MyThread(2)# 启动线程
t1.start()
t2.start()# 等待线程完成(同样,这里可能需要使用join方法来等待所有线程完成)
在这两种方法中,第二种方法(使用Thread
子类)提供了更高的灵活性和可重用性,尤其是当你需要在多个地方使用具有相似行为但可能稍有不同的线程时。然而,对于简单的任务,直接使用threading.Thread
类并传递一个函数作为target
参数通常更加快捷和方便。
请注意,在两种方法中,都需要调用线程的start()
方法来启动线程。调用start()
方法后,Python解释器会自动调用线程对象的run()
方法来执行线程的任务。你不应该直接调用run()
方法,因为这样做不会启动新线程,而是会在当前线程中同步执行run()
方法中的代码。