应用场景:多任务
多任务:指在同一时间内执行多个任务
多任务:
并发:在一段时间内交替去执行任务。
并行:对于处理CPU多任务,操作系统会给CPU的每个内核安排一个执行的软件,多个内核是正在的一切执行软件。
进程概念:
概念:一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说
每次启动一个进程,操作系统都会给它分配一定的运行资源(内存资源)保证进程的运行。
注意:一个程序运行后就是一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,
线程是依附在进程里面的,没有进程就没有线程。
进程应用的案例:
# 1 导入进程包
import multiprocessing
import os
# 2 添加任务
# 任务一
def sing():
# 获取当前进程的编号
print("sing的编号是:", os.getpid())
# 获取当前父进程编号
print("sing父进程的编号是:", os.getppid())
for i in range(5):
print("唱歌中....")
# 任务二
def dance(count):
# 获取当前进程的编号
print("dance的编号是:", os.getpid())
# 获取当前父进程编号
print("dance父进程的编号是:", os.getppid())
for i in range(count):
print("跳舞中....")
# 3 任务启动入口
if __name__ == '__main__':
# 进程配置
sing_process = multiprocessing.Process(target=sing)
# 此处args(必须传元组形式) ,或着 kwargs都可以进行传参
dance_process = multiprocessing.Process(target=dance, args=(5,))
# 启动进程
sing_process.start()
# 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
sing_process.join() # 没有join输出会错乱
dance_process.start()
"""
进程守护的两种方式-----未作正确展示
# 设置守护主进程的方式: 子进程对象.daemon=True
# 或者销毁子进程:子进程对象.terminate()
# 用法示例:
# sing_process.daemon=True
# sing_process.terminate()
"""
线程概念:
概念:线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码,需要CPU进行调度。
线程是CPU调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
说明:程序启动默认就会有一个主线程,自己创建的线程称为子线程,多线程可以完成多任务。
线程应用案例:
# 1 导包
import threading
# 此处使用了互斥锁---本文未介绍
lock1 = threading.Lock()
lock2 = threading.Lock()
# 2 创建应用
def first():
for i in range(1, 53, 2):
lock1.acquire()
print(i, end="")
print(i+1, end="")
lock2.release()
def second():
for j in range(65, 91):
lock2.acquire()
print(chr(j))
lock1.release()
# 3 启动应用
if __name__ == '__main__':
# 应用配置
first_thread = threading.Thread(target=first)
second_thread = threading.Thread(target=second)
# 启动线程
lock2.acquire()
first_thread.start()
second_thread.start()
进程和线程的对比:
1 关系对比:
线程依附于进程,没有进程就没有线程。
一个进程默认提供一条主线程,进程可以创建多个线程。
2 区别对比:
进程之间不共享全局变量。
线程之间共享全局变量,但是要注意资源竞争的地方,解决办法:互斥锁或者线程同步。
创建进程的资源开销要比创建线程的资源开销大。
进程是内存资源分配的基本单位,线程是CPU调度的基本单位。
线程不能独立执行,必须依存于进程中。
多进程开发比单进程开发稳定性要强。
3 优缺点对比:
进程优缺点:
优点:可以使用多核。
缺点:资源开销过大。
线程的优缺点:
优点:资源开销小。
缺点:不能使用多核。