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