在使用爬虫爬取数据或者处理大量任务时,当需要处理的数据量比较大且急需快速获取结果时,可以考虑将单线程程序改写为多线程或多进程程序。本文将深入讲解 Python 中单线程、多线程和多进程的基础知识、区别及代码实现方法。
一、进程和线程的概念
进程可以理解为正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的单位。由于每一次调度进程的开销比较大,为此才引入了线程。一个进程可以拥有多个线程,这些线程共享该进程的资源,线程的切换消耗是很小的。
在操作系统中引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
简单来说,如果将一个进程比喻成一个工作,指定 10 个人来做这份工作,这 10 个人就是 10 个线程。因此,在一定的范围内,多线程效率比单线程效率更高。
二、Python 中的多线程与单线程
在 Python 中,默认情况下是单线程的,简单理解为:代码是按顺序依次运行的。例如先运行第一行代码,再运行第二行,依次类推。
举个例子,批量下载某网站的图片,由于下载图片是一个耗时的 IO 操作,如果依然采用单线程的方式下载,那么效率就会特别低,意味着需要消耗更多的时间等待网络响应。为了节约时间,这时候我们就可以考虑使用多线程的方式来下载图片。
threading模块是 Python 中专门用来做多线程编程的模块,它对 thread进行了封装,使用更加方便。
1. 单线程与多线程对比案例
下面通过一个简单的例子来演示。假设需要对写代码和玩游戏两个事件进行模拟。
import threading
import time
# 定义第一个任务
def coding():
for x in range(3):
print('%s 正在写代码\n' % x)
time.sleep(1)
# 定义第二个任务
def playing():
for x in range(3):
print('%s 正在玩游戏\n' % x)
time.sleep(1)
# 如果使用多线程执行
def multi_thread():
start = time.time()
# Thread 创建第一个线程,target 参数为函数名
t1 = threading.Thread(target=coding)
t1.start() # 启动线程
# 创建第二个线程
t2 = threading.Thread(target=playing)
t2.start()
# join 是确保子线程执行完毕后才能继续执行主线程后续逻辑
t1.join()
t2.join()
end = time.time()
running_time = end - start
( % running_time)
__name__ == :
multi_thread()


