并发编程 - 线程[Python基础]

并发编程 – 线程

1、什么是线程

  进程:资源单位

  线程:执行单位

 

  线程与进程都是虚拟的概念,只是为了更好地表达某种事物

 

  注意:开启一个进程,一定会自带一个线程,线程才是真正的执行者

 

 

2、为什么要使用线程

  > 为了节省资源的占用

  > 多线程执行速度非常快 

 

  开启进程会发生什么:

    > 启动进程会产生一个内存空间,申请一块资源

    > 会自带一个主线程

    > 开启子进程的速度要比开启子线程的速度慢

  开启线程会发生什么:

    > 一个进程内可以开启多个线程,从进程的内存空间中申请资源

    > 节省资源

  # 比如开启三个进程:

    # 占用三分内存资源

  # 比如开启三个线程:

    # 从一个内存资源中,申请三个小的执行单位

 

  问题1:在单核情况下,开启多进程有没有提高执行效率?

    没有,在单核情况下,尽量开启多线程。

 

  问题:IO密集型、计算密集型分别使用什么?

    IO密集型:多线程

      IO(时间由用户决定):

        阻塞:切换+保存状态

    计算密集型:多进程

      计算(时间由操作系统定):

        计算时间很长:切换+保存状态

 

  注意:进程与进程之间数据是隔离的,线程与线程之间的数据是共享的

 

 

3、线程的两种创建方式、守护线程

  守护线程的使用方式和守护进程的使用方式一样,在下面创建线程中体现:

 

  第一种方式:直接调用Thread类

from threading import Thread    # Thread用来创建线程
from threading import current_thread    # current_thread中含有线程的属性
import time


def task():
    print(f"start...{current_thread().name}")    # current_thread().name 线程的名字
    time.sleep(1)
    print(f"end...{current_thread().name}")    # current_thread().name 线程的名字


if __name__ == "__main__":
    # 模拟开启10个子线程
    for i in range(10):
        # 开启子线程
        t = Thread(target=task)
        # 加上守护线程:主进程结束,代表主线程也结束,子线程有可能会被回收,将其他线程回收资源
        t.daemon = True
        t.start()
        # 告诉主线程等到子线程执行完成再执行主线程
        t.join()

    print(f"主进程(主线程)结束...{current_thread().name}")    # current_thread().name 线程的名字
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 并发编程 – 线程