【1】、使用 threading 模块
如果我们想要执行一个单独的任务,那么就需要创建一个新的线程。如果我们想在一个程序中有多个任务一起运行,那么就需要在程序中创建多个 Thread 对象即可。
在 Python 中,我们可以使用 threading 模块中的 Thread 类创建一个对象。这个对象表示一个线程,但它不会真正创建出来一个线程。而当我们调用 start() 方法时,才会真正创建一个新的子线程,并开始执行的。至于这个线程去执行哪里的代码,要看在用 Thread 创建对象的时候给 target 传递的是哪个函数的引用,即将来线程就会执行 target 参数指向的那个函数。target 指向的那个函数代码执行完之后,意味着这个子线程结束;
创建 Thread 对象时,target 参数指明线程将来去哪里执行代码,而 args 参数执行线程去执行代码时所携带的数据,并且 args 参数是一个元组。如果我们想给指定的参数传递数据,我们可以给 kwargs 参数传递一个字典。
代码执行到最后,虽然主线程没有了代码,但是它依然会等待所有的子线程结束之后,它才会真正的结束,原因是:主线程有个特殊的功能,用来对子线程产生的垃圾进行回收处理。当主线程结束之后,才意味着整个程序真正的结束;
import time
# 1.导入threading模块
from threading import Thread
def task(name):
print(f"{name}开始执行")
time.sleep(3)
print(f"{name}执行结束")
# 2.使用threading模块中Thread创建一个对象
t1 = Thread(target=task, args=("线程1",))
t2 = Thread(target=task, kwargs={"name": "线程2"})
# 3.调用这个实例对象的start()方法让这个线程开始执行
t1.start()
t2.start()
print("主线程执行了!")
一个程序中,可以有多个线程,执行相同的代码。但是,每个线程执行功能每个线程的功能,互不影响,仅仅是做的事情相同一样而已;
【2】、自定义类继承 Thread
我们可以自定义一个类继承 Thread,然后一定要实现它的 run() 方法,即定义一个 run() 方法,并且在方法中实现要执行的代码。当我们调用自己编写的类创建出来的对象的 start() 方法时,会创建新的线程,并且线程会自动调用 run() 方法开始执行。
如果除了 run() 方法之外还定义了很多其它的方法,那么这些方法需要在 run() 方法中自己去第调用,线程它不会自动调用。
import time
from threading import Thread
class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f"{self.name}开始执行")
time.sleep(1)
print(f"{self.name}执行结束")
t= MyThread("线程1")
t.start()
print("主线程执行")