详解Python进程与线程

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Python进程与线程相关的知识,希望对你有一定的参考价值。

一、进程

1. 1 进程概念

进程是资源分配的最小单位,程序隔离的边界。

CPU的时间片轮转,在不同的时间段切换执行不同的进程,但是切换进程是比较耗时的;就引来了轻量级进程,也就是所谓的线程,一个进程中包括多个线程(代码流,其实也就是进程中同时跑的多个方法体)

程序:例如xxx.py这是程序,是一个静态的

进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元

2.2 进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态。

  • 就绪态:运行的条件都已经满足,正在等在cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

进程的创建-multiprocessing

1. 创建子进程

说明

创建子进程跟创建线程十分类似,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动

Process语法结构如下:

Process([group [, target [, name [, args [, kwargs]]]]])

  • target:如果传递了函数的引用,这个子进程就执行这里(函数)的代码
  • args:给target指定的函数传递的参数,以元组的方式传递
  • kwargs:给target指定的函数传递命名参数
  • name:给进程设定一个名字,可以不设定
  • group:指定进程组,大多数情况下用不到

Process创建的实例对象的常用方法:

  • start():启动子进程实例(创建子进程)
  • is_alive():判断进程子进程是否还在活着
  • join([timeout]):是否等待子进程执行结束,或等待多少秒
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

  • name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
  • pid:当前进程的pid(进程号)

二、线程

2.1 线程概念

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

主线程:

当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。

主线程的重要性有两⽅⾯:
1)是产⽣其他⼦线程的线程;
2)通常它必须最后完成执⾏⽐如执⾏各种关闭动作。

子线程

可以看做是程序执行的一条分支,当子线程启动后会和主线程一起同时执行

1. 单线程执行

运行结果:

2. 使用threading模块 创建子线程

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

2.1 核心方法

  • threading.Thread(target=函数名) threading模块的Thread类 创建子线程对象
  • 线程对象 .start() 启动子线程

2.2 代码实现

运行结果:

说明

  • 1. 可以明显看出使用了多线程并发的操作,花费时间要短很多
  • 2. 当调用 start() 时,才会真正的创建线程,并且开始执行
  • 3. 每个线程都有一个唯一标示符,来区分线程中的主次关系
  • 4. 主线程:mainThread,Main函数或者程序主入口,都可以称为主线程
  • 5. 子线程:Thread-x 使用 threading.Thread() 创建出来的都是子线程
  • 6. 线程数量:主线程数 + 子线程数

3. 主线程会等待所有的子线程结束后才结束

三、进程、线程对比

目标

  • 知道多进程和多线程的区别

3.1 功能

进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ

线程,能够完成多任务,比如 一个QQ中的多个聊天窗口

3.2 使用区别

  • 进程是系统进行资源分配和调度的一个独立单位
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属同一个进程的其他的线程共享进程所拥有的全部资源
  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

  • 线程不能够独立执行,必须依存在进程中
  • 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人

3.3 进程与线程的选择取决以下几点:

  • 需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
  • 线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
  • 因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
  • 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
  • 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

以上是关于详解Python进程与线程的主要内容,如果未能解决你的问题,请参考以下文章

python 多线程详解

详解c++11多线程

java线程详解

进行概念详解 多线程上篇

安卓IPC机制之Binder详解

Linux内核线程kernel thread详解--Linux进程的管理与调度