python中threading开启关闭线程操作

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()方法来创建一个停止线程的对象。在一个完整的多线程程序中,我们需要考虑线程的互斥和同步问题,来避免线程安全问题。

后端开发标签