python-一篇学完线程进程的相关概念

目录

1.什么是线程

2.什么是进程

3.线程和进程的关系

4.什么是多线程

5.线程和进程的区别

6.多线程应用举例 

7.线程的常用方法

8.什么是守护线程

9.创建守护线程

10.多线程中join()的用法 

11. 并发和并行


1.什么是线程

  • 一条流水线工作的过程(流水钱工作需要电源,电源相当于cpu)
  • ​ 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一件事的缺陷,使得进程内并发成为可能

2.什么是进程

2.1 一条流水线必须属于一个车间,一个车间的工作过程是一个进程。

进程的组成:

  • 程序
  • 数据集
  • 进程控制块

 2.2 进程和程序的区别

程序仅仅是一堆代码,而进程指的是程序的运行过程。
同一个程序执行两次,那也是两个进程。比如打开腾讯视频,虽然都是同一个软件,但是一个可以播放《生活大爆炸》,一个可以播放《老友记》。

3.线程和进程的关系

  • 线程是流水线,进程是车间。

        车间负责把资源整合到一起,是一个资源单位,而一个车间至少有一条流水线。
所以:
        进程只是用来把资源集中到一起(进程只是一个资源单位,或者资源集合),而线程才是cpu上的执行单位。

  • 进程:最小的资源单元
  • 线程:最小执行单元
  • 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

4.什么是多线程

   多个控制线程。
   一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。
   举例:北京地铁和上海地铁是不同的进程;
              北京地铁中的12号线是一个线程,所有的地铁线共享北京地铁所有的资源。

 进程之间是竞争关系,线程之间是协作关系

车间直接是竞争/抢电源的关系,竞争(不同的进程直接是竞争关系,是不同的程序员写的程序运行的,迅雷抢占其他进程的网速,360把其他进程当做病毒干死)
一个车间的不同流水线式协同工作的关系(同一个进程的线程之间是合作关系,是同一个程序写的程序内开启动,迅雷内的线程是合作关系,不会自己干自己)

5.线程和进程的区别

  1. 线程共享创建它的进程的地址空间;进程有自己的地址空间。
  2. 线程可以直接访问同一进程的其他线程数据;进程有自己的主进程数据段副本。
  3. 线程可以直接与其进程的其他线程通信;进程必须使用进程间通信来与同级进程通信。
  4. 容易创建新线程;新进程需要负值父进程。
  5. 线程可以对同一进程的线程进行相当大的控制;进程只能对子进程进行控制。主线程的更改(取消、优先级更改等)可能会影响进程的其他线程的行为;对父进程的更改不会影响子进程。

关键区别,也是在特定场景下需要使用多线程的原因:
    1.同一个进程内的多个线程共享该进程内的地址资源(从而极大地提高了程序的运行效率。)
    2.创建线程的开销要远小于创建进程的开销
    (创建一个进程,就是创建一个车间,涉及到申请空间,而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)

6.多线程应用举例 

- 开启一个字处理软件进程,
        该进程可定需要办不止一件事:监听键盘输入,处理文字,自动保存文字到硬盘,
        这三个任务操作的都是同一块数据,
        所以不能用多进程。
        只能在一个进程中并发的开启三个线程。
        如果是单线程,那这三个任务每次只能做一个:键盘输入时不能处理文字和自动保存,自动保存时又不能输入和处理文字。

7.线程的常用方法

  • t1 = threading.Thread(target=函数名,args=(传入变量(如果只有一个变量就必须在后加上逗号),),name=取一个线程名) # 把一个线程实例化给t1,这个线程负责执行target=你写的函数名 
  • t1.start() # 执行启动这个线程
  • t1.join() # 必须要等t1这个子线程执行完成,即使主进程结束了也不会退出程序
  • t1.setDeamon(True) # :当你的主线程执行完毕后,不管子线程有没有执行完成都退出主程序,注意不能和t1.join()一起使用。
  • threading.current_thread().name # 打印出线程名

8.什么是守护线程

   - 在一个含有线程的python程序中,当主线程的代码运行完之后,如果还有其他子线程还未执行完毕,那么主线程会等待子线程执行完毕之后,再结束;
   - 如果有一个线程必须设置为无线循环,那么该线程不结束,意味着真个python程序就不结束,那为了能够让python程序正常退出,将这类无线循环的线程设置为守护线程,
   - 当程序中仅仅剩下守护线程时,python程序就能够正常退出,不必关心这类线程是否执行完毕。
   - 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 

  - 需要强调的是:运行完毕并非终止运行
        1. 对主进程来说,运行完毕指的是主进程代码运行完毕
        2. 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
  - 详细解释:
        1. 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。
        2. 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

9.创建守护线程

一个非守护线程可以通过两种方式设置为守护线程:
    1.在创建完线程,启动线程之前,通过setDaemon(True)方法,将线程设置为守护线程
    2.在利用Thread()构造线程时,将参数daemon设置为True,将线程设置为守护线程
    注意:必须在线程启动前(调用start())之前设置线程是否为守护线程。

守护线程的继承
    1.线程会继承当前线程的daemon的值,当前线程为守护线程,那么在该线程中新建的线程默认为守护线程
    即,主线程是非守护线程,因此在主线程中新建线程默认都是非守护线程
    在一个守护线程中,再创建新的线程时,就会继承当前线程的Daemon值,成为守护线程。

含有守护线程的程序退出与注意:
    1.当一个python程序中,只剩下守护线程时,并不会等待守护线程执行完毕,Python程序就会退出,所以在守护线程中不适合执行一些操作,比如文件的写入等等;
    2.虽然当主线程结束时,守护线程也会跟着结束,但不意味着,守护线程不会输出任何东西,毕竟系统通知守护线程该结束了,也会需要一些时间;

10.多线程中join()的用法 

 ①.当一个进程启动后,会默认产生一个主线程。因为线程是程序执行流的最小单元。
    当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),
    主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。(主线程结束,子线程正常运行到结束)
 ②.当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,
    可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止。(主线程结束,子线程被迫结束)
 ③.join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止。(主线程结束,等待子线程结束,主线程终止)
    join举例用法可以参考下面的链接,博主写的很详细。

(15条消息) Python多线程与多线程中 join() 的用法_AI悦创的博客-CSDN博客https://aiyuechuang.blog.csdn.net/article/details/117924970?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-117924970-blog-105031898.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-117924970-blog-105031898.pc_relevant_antiscanv2&utm_relevant_index=1

11. 并发和并行

并行处理(Parallel Processing):是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。

并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行。

  • 并发:指系统具有处理多个任务的能力
  • 并行:指系统具有 同时 处理多个任务的能力

所以说,并行是并发的子集。

并行:同时运行,只有具备多个cpu才能实现并行。

多道技术:单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的):有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,这就是单核下的多道技术。而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分配给四个cpu中的任意一个去执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值