欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day06课堂笔记

程序员文章站 2024-03-21 23:01:40
...

1. 进程

1.1 概念

线程- 轻量级进程

​ 操作系统进行资源 调度 的基本单位

​ 线程必须依附于进程而存在 不能独立存在

进程

​ 是操作系统进行资源 分配 的基本单位

同一个进程内部的多个线程共享全局资源

一个运行程序默认一个进程-主进程, 一个进程中默认一个线程 - 主线程

1.2 验证系统中进程

​ PID 进程标识

​ ps -aux

​ ps process status

​ 获取当前进程的PID

​ os.getpid()

​ 获取当前进程的父进程的PID

​ os.getppid()

1.3 线程的创建和操作

​ 创建

​ pro = multiprocessing.Process(target=入口, args=(), kwargs={})

​ pro.start()

​ 阻塞等待子进程

​ pro.join() 一直等待 死等

​ pro.join(2) 阻塞等待子进程2秒 如果子进程没有终止那主进程就直接往下执行

​ 终止子进程

​ pro.terminate()

​ 判断子进程状态

​ pro.is_alive()

1.4 进程间通信

​ 原因: 进程间不共享全局资源

​ Queue 是一种进程间通信的方式

​ 是一种队列 先进先出

Queue使用

创建 队列对象 = multiprocessing.Queue(长度)

放   队列对象.put(数据)

取   数据 = 队列对象.get()

判断空 队列对象.empty()

判断满 队列对象.full()

数量  队列对象.qsize()
get方法的参数  get(block=True, timeout=None)
	block表示是否阻塞等待
	timeout超时-等待的时间  None表示一直等待

	数据 = 队列对象.get() = .get(True) = .get(True,None)
	.get(True, 10) 等待10s
	.get(False)  不等待  = .get_nowait()


put方法的参数 put(data, block=True, timeout=None)
	block表示是否阻塞等待
	timeout超时-等待的时间  None表示一直等待

	.put(100) = .put(100, True) = .put(100, True, None)  一直等待
	.put(100, True, 10)  等待10s
    .put(100, False) 不等待	= .put_nowait()

1.5 进程池

工作模式:

​ 提前创建一批进程

​ 重复利用已经空闲的进程执行 多任务

优点:

​ 节约了 大量进程的创建/销毁的开销

​ 提高任务的响应速度

添加任务的两种方式

​ 同步方式

​ 会阻塞等待添加任务的执行完成后才会继续往下执行

​ 异步方式

​ 只添加任务 不会等待任务执行完成

使用步骤:

​ 1 创建进程池 进程池对象 = multiprocessing.Pool(工作进程的数量)

​ 2 添加任务

​ 同步 进程池对象.apply(入口) 添加任务并等待任务执行完成

​ 异步 进程池对象.apply_async(入口) 只添加任务 不等待任务完成

​ 3 关闭进程池

​ 进程池对象.close() 不允许添加新任务

​ 4 等待所有任务执行完成

​ 进程池对象.join()

注意:

​ 进程池之间的进程通信不能使用multiprocessing.Queue 而应该使用 multiprocessing.Manager().Queue

1.6 进程对比线程

​ 进程 线程

​ 分配 调度

​ 不共享 共享

​ 独立存在 依附于进程

​ 可以用多核

系统提供原生的线程 可以使用多核CPU

CPython解释器产生的多线程 由于GIL问题 不能使用多核CPU

相关标签: 进程