python 多线程 多进程同时运行
多任务要求
- python 基础语法
- python 文件目录操作
- python 模块应用
开发工具
pycharm
实现方法
多任务的实现可以用进程和线程来实现
进程—> 线程----> 多任务应用
多进程操作
比如下载多个文件, 利用cpu 资源 提高效率
多任务: 同一时间执行多个任务, 比如windows操作系统
执行方式有两种( 表现形式 )
并发
在单核cpu中:
在一段时间内交替执行多个任务, 例如单核cpu 处理多任务, 操作系统让各个任务交替进行
并行
多核cpu 给每个核都分配一个任务 每个核执行自己的任务
真正意义上的同时执行
如何实现( 原理 )
多进程
python 中实现多进程来实现多任务, 进程是操作系统进行资源分配和调度的最小单位, 一个运行起来的程序叫做进程, 没有在运行的程序叫做程序
当一个.py 文件运行的时候系统会创建一个主进程
比如
def fun1():
print(1)
def fun2():
print(2)
fun1()
fun2()
代码运行的时候系统会先执行fun1 在执行fun2 按顺序运行
使用多进程的话: 在程序运行的时候会创建一个主进程, 那么在程序运行除了主进程之外创建一个子进程, 我们让主进程去执行fun1(), 让子进程去执行fun2(), 让他们两个同时执行, 来实现多任务同时进行
多进程完成多任务
首先要知道如何去创建第二个进程, 第三个进程, 进程的创建有三个步骤
- 导入进程包
import multiprocessing
- 通过进程类去创建进程对象
- 进程对象=multiprocessing.Process()
- 启动进程执行任务
- 进程对象.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()
获取进程编号
- 获取当前进程的编号
- os.getpid()
- 获取当前父进程的编号
- os.getppid()
import os
os.getpid()
def work():
print('work 进程编号', os.getpid())
print('work 父进程编号', os.getppid())
主进程默认不会结束, 在子进程全部结束之后才会关闭主进程
在实际中我们想要的效果, 主进程关闭,, 子进程全部关闭
设置守护主进程
希望主进程关闭的时候子进程不在执行. 则需要设置守护选项
子进程对象.daemon=True
那么在主进程运行完成之后, 那么子进程也将会自动结束
os 部分操作
os 创建目标文件夹目录
os.mkdir(dir)
多线程
实现多任务的另一种形式, 进程是分配资源的最小单位, 线程是程序执行的最小单位, 一个进程中最少有一个线程来负责该进程, 比如一个QQ(一个进程) 打开了两个窗口(两个线程)跟两个人聊天, 线程自己并不需要系统资源, 线程与其他线程共享这个进程的资源, 因此使用多线程的时候实现了资源节约,
- 多线程是Python 程序中实现多任务的一种方式
- 线程是程序执行的最小单位
- 同属于一个进程的多线程共享进程拥有的所有资源
多线程实现多任务
线程的创建步骤
- 导入线程模块
import threading
- 通过线程类去创建线程对象
线程对象=threading.Thread(target=任务名)
- 启动线程执行任务
- 线程对象.start()
参数名 | 说明 |
target | 执行目标的任务名, 这里值函数名( 方法名) |
name | 线程名, 一般不用设置 |
group | 线程组, 目前只能使用None |
其他的一毛一样
进程线程对比
关系对比
- 线程是依附在进程里边的, 没有进程就没有线程
- 一个进程默认提供一条线程, 进程可以创建多个线程
区别对比
- 进程创建的开销要比线程的开销要大
- 进程是操作系统资源分配的基本单位, 线程是cpu 调度的基本单位
- 线程不能独立执行, 必须依存进程
优缺点对比
- 进程优缺点:
优点:可以用多核
缺点:资源开销大 - 线程优缺点
优点: 资源开销小
缺点:不能使用多核
本笔记总结于bilibili 黑马程序员
多进程多线程视频