1.什么是多线程
在讲解python中如何开启和关闭线程之前,我们需要先了解一下什么是多线程。多线程是指在一个程序中,开启多个并发执行的线程。相比单线程,多线程可以提高程序的执行效率。
1.1 单线程的缺点
在单线程模式下,程序的执行是顺序的,每一个任务都必须等待前面的任务执行结束之后才能执行。这就导致了程序单线程的执行效率比较低。
例如,有一个爬虫程序需要爬取多个网站的信息,每次请求需要耗费较长的时间。如果这个爬虫程序采用单线程模式执行,那么在爬取一个网站时,程序必须等待请求处理完成之后才能去访问下一个网站。在这个过程中,程序会持续等待,造成了程序执行效率的降低。
1.2 多线程的优点
相比单线程,多线程可以并行地执行多个任务,从而提高程序的执行效率。在上面的爬虫程序中,如果我们采用多线程的方式去执行,那么程序就可以同时访问多个网站,将请求处理的时间最大化地利用起来。这样可以大大提高程序的执行效率。
2.python中的多线程模块
在python中,我们可以使用threading模块来创建多线程。
import threading
def worker():
print('Worker')
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
上面的代码中,我们创建了5个线程,每一个线程都会执行worker函数。我们可以使用start()方法来开启一个线程。
2.1 开启新线程
在threading模块中,我们可以使用Thread类来创建一个线程对象。创建一个线程的方式如下:
t = threading.Thread(target=worker)
其中,worker指的是我们要执行的任务。可以是一个函数,也可以是一个方法。接下来,我们调用start()方法来开启这个线程:
t.start()
2.2 查看当前线程
我们可以使用threading.current_thread()方法来查看当前线程信息。
import threading
def worker():
print('Current thread:', threading.current_thread().name)
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
上面的代码中,我们定义了一个worker函数,每个线程都会执行它。在worker函数中,我们使用threading.current_thread().name方法来查看当前执行线程的名字。
3.线程的状态
在使用多线程的过程中,线程有不同的状态。常见的状态有3种:
就绪状态:线程可以开始执行。
执行状态:线程正在执行。
阻塞状态:线程暂停执行,等待外部事件的发生。
我们可以通过threading.enumerate()方法来查看当前所有线程的状态:
import time
import threading
def worker():
print('Worker thread:', threading.current_thread().name)
time.sleep(2)
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threading.enumerate():
print('Thread status:',t)
上面的代码中,我们定义了一个worker函数,在函数中使用time.sleep(2)方法来模拟线程的执行。在主线程中,我们使用threading.enumerate()方法来遍历所有线程的状态。
4.关闭线程
在多线程编程中,有时候我们需要手动关闭一个线程。我们可以使用threading.Event()方法来创建一个停止线程的对象。下面是示例代码:
import threading
class WorkerThread(threading.Thread):
def __init__(self, stop_event):
threading.Thread.__init__(self)
self.stop_event = stop_event
def run(self):
while not self.stop_event.is_set():
print('Worker thread:', threading.current_thread().name)
print('Thread stopping...')
stop_event = threading.Event()
threads = []
for i in range(5):
t = WorkerThread(stop_event)
threads.append(t)
t.start()
stop_event.set()
for t in threads:
t.join()
print('Done')
上面的代码中,我们定义了一个WorkerThread类,这个类继承了threading.Thread类。在WorkerThread的构造函数中,我们传入了一个stop_event对象用来停止线程。在run()方法中,我们不停地打印当前线程的名字,直到stop_event对象设置为True,就退出线程。
在主线程中,我们使用stop_event.set()方法来停止所有线程,然后使用join()方法等待所有线程完成。最后,我们输出'Done'来表示程序执行结束。
总结
在python中,我们可以使用threading模块来开启和关闭线程。使用多线程可以提高程序的执行效率。在线程编程中,线程有不同的状态,我们可以使用threading.enumerate()方法来查看线程的状态。有时候我们需要手动关闭一个线程,你可以使用threading.Event()方法来创建一个停止线程的对象。在一个完整的多线程程序中,我们需要考虑线程的互斥和同步问题,来避免线程安全问题。