Python多线程编程——多线程基础介绍

一、进程和线程的区别和联系

提到多线程编程,我们肯定要说一说线程和进程的关系。首先先说一下他们的官方定义:

  • 进程(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来创建多线程以及多线程和单线程的不同。

我们可以看到,如果使用多线程,那么在同一时刻,可以执行多个任务,在这个实例中,是可以同时执行写字和绘画这两个任务。

在后面的实例中,我们会使用多线程进行爬虫操作。那个时候,我们就可以在同一时刻,进行多个页面的爬虫,或者在同一时刻,进行爬取网页、整理数据、下载图片等多个任务,可以成倍地提高我们的爬虫效率。

这些知识都是自己工作之余的总结,希望能够帮助到大家,关于多线程编程的更多知识,我会尽快写出来。如果有错误,还希望大家及时指出。但是拒绝无脑喷~

猜你喜欢

转载自blog.csdn.net/fengzhen8023/article/details/83143588