python 多线程 多进程同时运行

多任务要求

  1. python 基础语法
  2. python 文件目录操作
  3. python 模块应用

开发工具

pycharm

实现方法

多任务的实现可以用进程和线程来实现

进程—> 线程----> 多任务应用

多进程操作

比如下载多个文件, 利用cpu 资源 提高效率

多任务: 同一时间执行多个任务, 比如windows操作系统

执行方式有两种( 表现形式 )

并发

在单核cpu中:

在一段时间内交替执行多个任务, 例如单核cpu 处理多任务, 操作系统让各个任务交替进行

并行

多核cpu 给每个核都分配一个任务 每个核执行自己的任务

真正意义上的同时执行

如何实现( 原理 )

多进程

python 中实现多进程来实现多任务, 进程是操作系统进行资源分配和调度的最小单位, 一个运行起来的程序叫做进程, 没有在运行的程序叫做程序

当一个.py 文件运行的时候系统会创建一个主进程

比如

def fun1():
    print(1)
def fun2():
    print(2)
    
fun1()
fun2()

代码运行的时候系统会先执行fun1 在执行fun2 按顺序运行

使用多进程的话: 在程序运行的时候会创建一个主进程, 那么在程序运行除了主进程之外创建一个子进程, 我们让主进程去执行fun1(), 让子进程去执行fun2(), 让他们两个同时执行, 来实现多任务同时进行

多进程完成多任务

首先要知道如何去创建第二个进程, 第三个进程, 进程的创建有三个步骤

  1. 导入进程包
  • import multiprocessing
  1. 通过进程类去创建进程对象
  • 进程对象=multiprocessing.Process()
  1. 启动进程执行任务
  • 进程对象.start() 来开始执行进程
import threading
import time
import os
def fun1():
    for i in range(3):
        print('1')
        time.sleep(1)

def fun2():
    for i in range(3):
        print('2')
        time.sleep(3)


if __name__ == '__main__':
    sing_thread = threading.Thread(target=fun1)
    song_thread = threading.Thread(target=fun2)

    sing_thread.start()
    song_thread.start()

通过进程类创建进程对象

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

参数名

说明

target

执行的目标任务名, 这里指的是函数名(方法名)

name

进程名, 一般不用设置(系统自动为进程设置默认名字Process-1····)

group

进程组, 目前只能使用None

必须要指定进程的名字target

def none():
    pass
   
process = multiprocessing.Process(target=none)
process.start()

进程如何执行带有参数的任务

参数名

说明

args

以元祖的方式给任务传递参数, 顺序要正确

kwrags

以字典的方式给执行任务传递参数, key 跟参数名要一致

process = multiprocessing.Process(target=function, args=(10,)) arg传递的必须是参数所以传递一个变量的时候需要(10,)

process = multiprocessing.Process(target=function, kwargs={'key': value})

import multiprocessing
import time
import os

def fun1(num):
    print('1进程PID', os.getpid())
    print('1进程父进程编号', os.getppid())
    for i in range(num):
        print('1....\n')
        time.sleep(0.5)


def fun2(num):
    print('2进程PID', os.getpid())
    print('2进程父进程编号', os.getppid())
    for i in range(num):
        print('2...')
        time.sleep(0.5)

# 1. 导入进程包

if __name__ == '__main__':
    sing_process = multiprocessing.Process(target=fun1, args=(5,))
    dance_process = multiprocessing.Process(target=fun2, kwargs={'num':2}) # target

    #3. 启动进程
    sing_process.start()
    dance_process.start()

获取进程编号

  1. 获取当前进程的编号
  • os.getpid()
  1. 获取当前父进程的编号
  • os.getppid()
import os 
os.getpid()
def work():
    print('work 进程编号', os.getpid())
    print('work 父进程编号', os.getppid())

主进程默认不会结束, 在子进程全部结束之后才会关闭主进程

在实际中我们想要的效果, 主进程关闭,, 子进程全部关闭

设置守护主进程

希望主进程关闭的时候子进程不在执行. 则需要设置守护选项

子进程对象.daemon=True 那么在主进程运行完成之后, 那么子进程也将会自动结束

os 部分操作

os 创建目标文件夹目录

os.mkdir(dir)

多线程

实现多任务的另一种形式, 进程是分配资源的最小单位, 线程是程序执行的最小单位, 一个进程中最少有一个线程来负责该进程, 比如一个QQ(一个进程) 打开了两个窗口(两个线程)跟两个人聊天, 线程自己并不需要系统资源, 线程与其他线程共享这个进程的资源, 因此使用多线程的时候实现了资源节约,

  1. 多线程是Python 程序中实现多任务的一种方式
  2. 线程是程序执行的最小单位
  3. 同属于一个进程的多线程共享进程拥有的所有资源

多线程实现多任务

线程的创建步骤

  1. 导入线程模块
  • import threading
  1. 通过线程类去创建线程对象
  • 线程对象=threading.Thread(target=任务名)
  1. 启动线程执行任务
  • 线程对象.start()

参数名

说明

target

执行目标的任务名, 这里值函数名( 方法名)

name

线程名, 一般不用设置

group

线程组, 目前只能使用None

其他的一毛一样

进程线程对比

关系对比

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

区别对比

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

优缺点对比

  1. 进程优缺点:
    优点:可以用多核
    缺点:资源开销大
  2. 线程优缺点
    优点: 资源开销小
    缺点:不能使用多核

本笔记总结于bilibili 黑马程序员
多进程多线程视频