Python - 创建线程
你好,有抱负的Python程序员们!今天,我们将深入到令人激动的线程世界。如果你之前从未听说过线程,请不要担心——我们将从头开始,逐步深入学习。在本教程结束时,你将能够像专业人士一样创建线程!
什么是线程?
在我们开始创建线程之前,先来了解一下线程是什么。想象一下你正在烹饪一道复杂的菜肴。你不是一件一件地做——你可能会在一边的炉灶上煮意大利面,同时在切菜板上切蔬菜。这类似于线程在编程中是如何工作的。它们允许你的程序的不同部分同时运行,使你的代码更高效。
使用函数创建线程
在Python中创建线程的最简单方法是使用函数。让我们从一个基本的例子开始:
import threading
import time
def print_numbers():
for i in range(5):
print(f"数字 {i}")
time.sleep(1)
# 创建一个线程
thread = threading.Thread(target=print_numbers)
# 启动线程
thread.start()
print("主线程继续运行")
# 等待线程完成
thread.join()
print("线程已结束")
让我们分解一下:
- 我们导入了
threading
模块,它提供了我们处理线程所需的工具。 - 我们定义了一个简单的函数
print_numbers()
,它从0打印到4的数字,每个打印之间有1秒的暂停。 - 我们使用
threading.Thread()
创建了一个线程,将我们的函数指定为target
。 - 我们用
thread.start()
启动线程。 - 主程序继续运行,打印"主线程继续运行"。
- 我们使用
thread.join()
等待我们的线程完成再继续。
当你运行这个程序时,你会看到"主线程继续运行"立即被打印出来,而数字则在后台被打印。这就是线程的强大之处!
通过扩展Thread类创建线程
创建线程的另一种方法是扩展Thread
类。当你想创建一个可重用的线程对象时,这种方法很有用。以下是一个例子:
import threading
import time
class NumberPrinter(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
for i in range(5):
print(f"{self.name}: 数字 {i}")
time.sleep(1)
# 创建两个线程
thread1 = NumberPrinter("线程 1")
thread2 = NumberPrinter("线程 2")
# 启动线程
thread1.start()
thread2.start()
print("主线程继续运行")
# 等待两个线程完成
thread1.join()
thread2.join()
print("两个线程都已结束")
在这个例子中:
- 我们定义了一个
NumberPrinter
类,它扩展了threading.Thread
。 - 我们重写了
__init__
方法,以接受我们线程的名称。 - 我们重写了
run
方法,它在线程启动时被调用。 - 我们创建了
NumberPrinter
类的两个实例并启动它们。 - 两个线程同时运行,打印它们的数字。
这种方法让我们对线程有了更多的控制,并且可以轻松地创建多个实例。
使用start_new_thread()函数创建线程
在Python中创建线程的第三种方法是使用_thread
模块的start_new_thread()
函数。然而,这种方法被认为是低级的,并不适用于大多数用例。以下是一个完整的例子:
import _thread
import time
def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name}: 数字 {i}")
time.sleep(1)
# 启动两个新线程
try:
_thread.start_new_thread(print_numbers, ("线程 1",))
_thread.start_new_thread(print_numbers, ("线程 2",))
except:
print("错误:无法启动线程")
# 保持主线程活动
time.sleep(6)
print("主线程退出")
这种方法比较不灵活,提供的控制也没有前两种方法多。使用这种方法等待线程完成也比较困难。
线程创建方法比较
以下是三种方法的快速比较:
方法 | 优点 | 缺点 |
---|---|---|
使用函数 | 实现简单,适合一次性任务 | 可重用性较低,控制有限 |
扩展Thread类 | 可重用,控制更多,面向对象 | 设置起来稍微复杂 |
start_new_thread() | 低级控制 | 管理困难,不灵活,不推荐 |
结论
恭喜你!你已经迈出了Python线程世界的第一步。我们讨论了三种不同的创建线程的方法,每种都有自己的优点和使用场景。请记住,线程可以使你的程序更高效,但也会引入复杂性。在你继续Python之旅时,你将了解更多关于何时以及如何有效地使用线程。
继续练习,很快你将能够像一个经验丰富的程序员一样使用线程。祝编程愉快!
Credits: Image by storyset