0%

Python 多线程

进程

1.1 多任务的概念

多任务在同一时间内执行多个任务

1.2 多任务的执行方式

  • 并发
  • 并行

1.3 并发

在一段时间内交替执行

(单核cpu一定是并发)

1.4 并行

在一段时间内真正的同时一起执行多个任务

(多个核cpu在一起同时执行多个任务)

2.进程

2.1 程序中实现多任务的方式

在python中, 想要实现多任务可以使用多进程来完成

2.2 进程的概念

进程(process)是资源分配的最小单位, 他是操作系统进行资源分配和调度运行的基本单位, 通俗理解: 一个正在运行的程序就是一个进程

3 多进程完成多任务

3.1进程的创建步骤

  1. 导入进程包

​ import multiprocessing

\2. 通过进程累穿件进程对象

​ 进程对象 = multiprocessing.Process()

\3. 启动进程执行任务

​ 进程对象.start()

3.2 通过进程类创建对象

进程对象 = multiprocessing.Process(target=任务名)

参数名 说明
target 执行的目标任务名,这里指函数名(方法名)
name 进程名(一般不设置)
group 进程组, 目前只能使用None

4.进程执行带有参数的任务

参数名 说明
args 以元组的方式给执行任务传参
kwargs 以字典的方式给执行任务传参

4.1 args参数使用

进程对象 = multiprocessing.Process(target=任务名, args = (3,4,7))

⚠️多个参数需要注意顺序

4.2 kwargs参数的使用

进程对象 = multiprocessing.Process(target=任务名, kwargs=({‘’name‘’: xiaoming, ’’num’’: 3})

⚠️key的名就是参数的名字

5 获取进程的编号

当程序中进程的数量越来越多, 如果没有办法区分主进程和子进程还有不同的进程, 那么就无法进行有效的进程管理, 为了方便管理实际上每个进程都是有自己的编号

两种方式(import os)

  1. 获取当前进程编号

​ os.getpid()

  1. 获取当前父进程编号

​ os.getppid()

⚠️进程的注意点

主进程会等待所有子进程执行结束再结束

解决方法:

设置守护(主进程结束子进程自动结束,不再执行)

在启动子进程前 子进程对象.daemon = True

线程

进程是分配资源的最小单位,创建一个进程就会分配一定的资源, 会比较浪费资源

线程是程序执行的最小单位, 线程负责利用资源, 一个进程最少有一个线程来负责执行程序. 线程自己不拥有系统资源, 只需要一点在运行中必不可少的资源, 但它可与同属一个进程的其他线程共享进程所拥有的全部资源

多线程的创建:

  1. 导入线程模块

​ import threading

  1. 通过线程类创建线程对象

​ 线程对象 = threading.Tread(target = 任务名)

  1. 启动线程对象

​ 线程对象.start()

参数名 说明
target 执行的目标任务名,这里指函数名(方法名)
name 进程名(一般不设置)
group 进程组, 目前只能使用None

主线程会等待所有子线程结束再结束

解决方法:

设置守护主线程 添加参数 daemon = True

或者在线程开始前 线程对象.setdaemon = True

线程的执行是无序的

关系:

  • 线程是依附在进程里, 没有进程就没有线程
  • 一个进程默认提供一条线程, 进程可以创建多个线程

区别:

  • 创建进程的开销要比创建线程要大
  • 进程是操作系统资源分配的基本单位, 线程是cpu调度的基本单位
  • 线程不能独立执行,必须在进程中

优缺点:

  • 进程可以使用多核, 消耗大
  • 线程不可以使用多核, 消耗小

参考来源: https://www.bilibili.com/video/BV1fz4y1D7tU?p=3