Python 多任务 之 进程间的通信 和 进程池实现步骤

进程概述:

  • 程序是静态的, 当程序运行起来就叫做进程, 是操作系统分配资源的基本单元

进程的状态:

  • 就绪态:运行的条件都已经慢去,正在等待cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

进程 线程 的区别 优缺点:

功能

  • 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ
  • 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口

定义不同

  • 进程 是系统进行资源分配的最小单位
  • 线程 是进程的一个实体,是CPU进行调度的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

区别

  • 进程之间不同享全局变量, 线程之间共享全局变量
  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  • 线程不能够独立执行,必须依存在进程中
  • Python 多任务 之 进程间的通信 和 进程池实现步骤

优缺点

  • 线程执行开销小,但不利于资源的管理和保护;而进程正相反。

 

进程的创建步骤:

# 导入进程模块
import multiprocessing

# 创建一个进程的实例对象, 用 help(multiprocessing.Process) 可以查看其使用方法
p = multiprocessing.Process(target=func_name, args=(元组), kwargs={字典})

# 创建并启动进程
p.start()

# 等待子进程5秒钟, 再继续往下执行主进程
p.join(5)

 

通过 Queue 实现进程间的通信:

# 导入进程模块
import multiprocessing

# 创建一个队列
q = multiprocessing.Queue(3)   # 3 代表队列中最多可以接收3条消息

# 向队列中添加数据
q.put(data)

# 从队列中取数据
q.get()

# 判断队列中是否为空
q.empty()

# 判断队列中是否已满
q.full()

注意: 如果是通过进程池创建的进程, 那队列的使用要用multiprocessing.Manager().Queue()的方式, 否则会报错

 

进程池 Pool 概述:

  • 当需要创建的子进程数量不多时, 可以直接利用multiprocessing中的process动态产生多个进程
  • 但如果是上百个甚至不确定数量的时候, 此时就可以使用multiprocessing模块提供的Pool方法
    • 初始化 Pool 时, 可以指定一个最大的进程数, 当有新的请求提交到pool时, 如果池还没有满, 那么就会创建一个新的进程用来执行该请求,
    • 但如果池中的进程数已达到最大值, 那么该请求就会等待, 直到池中有进程结束, 才会用之前的进程来执行新的任务

 

进程池的实现步骤:

# 导入进程池模块
from multiprocessing import Pool

# 定义进程池, 最大进程池最大数(默认电脑本机的核心数)
po = Pool(3)

# 通过进程池调用目标, apply_async 非阻塞, 不会等待子进程结束; apply_async 阻塞, 会等待子进程结束才结束
po.apply_async(要调用的目标, (传给目标的元组参数,))

# 关闭进程池
po.close()

# 等待进程池执行完毕
po.join()

# 不管任务是否完成, 立即终止
po.terminate()

 

上一篇:SAP MM 明明有维护源清单,还是不能下PO?


下一篇:洛谷 P1583 魔法照片 快排