一、进程和线程的区别和联系
提到多线程编程,我们肯定要说一说线程和进程的关系。首先先说一下他们的官方定义:
-
进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
-
线程 有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
以上是线程和进程的区别和联系,如果你理解的还不够透彻,那么给你举一个例子。比如有一辆拉煤炭的火车,这一辆火车就是一个进程,它把煤炭从山西拉倒太原,这样就完成了一次任务。火车中的车厢就是一个个线程。如果只有一个车厢,我们可以说这是单线程;如果有2个以上的车厢,我们就说这是多线程。车厢越多,线程就越多,对应的结果是这辆火车拉送的煤炭越多。
关于线程,我们还要知道:一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。理解了这一点,对于掌握Python中的多线程编程就比较容易了。
二、多线程编程的方法
进行多线程编程,需要使用Python自带的 threading 库,使用这个库中的 threading.Thread(target=)
函数来创建线程,其中传给target的是一个函数。然后使用 start()
函数来启动进程。
比如我们要在一个进程中创建进程两个线程,并将这个两个线程启动,可以使用以下代码:
import threading
# 定义线程要执行的函数
def writing():
print("我正在写字")
# 定义线程要执行的函数
def drawing():
print("我正在绘画")
t1 = threading.Thread(target=writing) # 创建线程t1
t2 = threading.Thread(target=drawing) # 创建线程t2
t1.start() # 开启线程
t2.start() # 开启线程
三、多线程编程的实例
下面我们举一个简单的例子,来说一说单线程编程和多线程编程的不同。
首先引入我们需要的库,一个是 threading ,用来创建多线程;一个是 time ,用来帮助我们更清楚的看到执行过程。
import time
import threading
比如现在我们有两个工作,一个是写字,一个是绘画。我们将这两个工作定义成两个函数,具体代码如下:
def writing():
print("我正在写字")
time.sleep(1) # 沉睡1秒,方便我们看到执行的过程
def drawing():
print("我正在绘画")
time.sleep(1) # 沉睡1秒,方便我们看到执行的过程
如果我们不使用多线程编程,来执行这两个函数,那么这个时候是先执行一个函数,这个函数完成之后,再去执行另外一个函数。示例代码如下:
def main():
writing()
drawing()
time.sleep(1) # 沉睡1秒,方便我们看到执行的过程
if __name__ == '__main__':
# 连续执行三次,方便我们观察这个过程
main()
main()
main()
单线程编程,程序运行的结果是这个样子:
如果我们采用多线程编程,比如我们创建两个进程,一个进程用来执行写字这个工作,一个进行用来执行绘画这个工作,那么这两个工作就可以同时进行了。示例代码如下:
def main():
t1 = threading.Thread(target=writing) # 创建线程t1
t2 = threading.Thread(target=drawing) # 创建线程t2
t1.start()
t2.start()
time.sleep(1) # 沉睡1秒,方便我们看到执行的过程
if __name__ == '__main__':
main()
main()
main()
多线程编程,程序运行的结果是这个样子:
四、备注
这一节我们只讲了如果使用Python来创建多线程以及多线程和单线程的不同。
我们可以看到,如果使用多线程,那么在同一时刻,可以执行多个任务,在这个实例中,是可以同时执行写字和绘画这两个任务。
在后面的实例中,我们会使用多线程进行爬虫操作。那个时候,我们就可以在同一时刻,进行多个页面的爬虫,或者在同一时刻,进行爬取网页、整理数据、下载图片等多个任务,可以成倍地提高我们的爬虫效率。
这些知识都是自己工作之余的总结,希望能够帮助到大家,关于多线程编程的更多知识,我会尽快写出来。如果有错误,还希望大家及时指出。但是拒绝无脑喷~