操作系统–实例5(实现支持异步任务的线程池)

文章目录

  • 一、背景介绍
  • 二、python的同步原语
    • 1、互斥量
    • 2、条件变量
  • 三、实现线程安全的队列Queue
    • 1、队列
    • 2、实现线程安全的队列的功能
    • 3、什么会影响线程安全
    • 4、编程实现
  • 四、实现基本任务对象Task
    • 1、概念
    • 2、编程实现
  • 五、线程池简介
    • 1、什么是线程池
    • 2、为什么使用线程池
  • 六、实现任务处理线程Process Thread
    • 1、功能、必备属性
    • 2、编程实现
  • 七、实现任务处理线程池Pool
    • 1、线程池基本功能
    • 2、实现任务处理线程池
    • 3、编程实现
  • 八、编写测试用例
  • 九、实现异步任务处理AsyncTask

一、背景介绍

实现支持异步任务的线程池
使用python3

  • 很多语言都提供了线程池
    • Java:ThreadPoolExecutor
    • Python3:ThreadPoolExecutor

本篇的主要内容:

操作系统--实例5(实现支持异步任务的线程池)

二、python的同步原语

1、互斥量

  • 申请:lock=threading.Lock()
  • 加锁:lock.acquire()
  • 解锁:lock.release()

2、条件变量

  • 申请条件变量:condition=threading.Condition()
  • 加锁:condition.acquire()
  • 解锁:condition.release()
  • 等待:condition.wait()
  • 唤醒:condition.notify()
  • python中不需要将条件变量和互斥量自己结合,threading库直接将互斥量放入条件变量中

三、实现线程安全的队列Queue

1、队列

  • 队列用于存放多个元素,是存放各种元素的池
    • 存放的元素可以是线程,可以是任务,也可以是别的

2、实现线程安全的队列的功能

  • 获取当前队元素数量
  • 往队列放入元素
  • 从队列取出元素

3、什么会影响线程安全

队列可能有多个线程同时操作,因此需要保证线程安全

比如:

  • 场景: 多个线程同时访问队列元素
    • 目的: 为了保证多个线程获取的串行
    • 方法: 使用“锁”保护队列
  • 场景: 队列元素为空时获取队列元素,
    • 目的: 此时阻塞线程,等待队列到队列不为空,
    • 方法: 使用条件变量等待队列元素不为空

4、编程实现

queue.py

四、实现基本任务对象Task

1、概念

指放入队列中的任务对象

  • 实现基本任务对象需要
    • 任务参数
    • 任务唯一标记(uuid)
    • 任务具体的执行逻辑

2、编程实现

task.py

五、线程池简介

1、什么是线程池

  • 线程池是存放多个线程的容器
  • CPU调度线程执行后不会销毁线程
  • 将线程放回线程池重复利用

2、为什么使用线程池

  • 线程是稀缺资源,不应该频繁创建和销毁
  • 架构解耦,线程创建和业务处理解耦,更加优雅
  • 线程池是使用线程的最佳实践

六、实现任务处理线程Process Thread

1、功能、必备属性

  • 任务处理线程需要不断的从任务队列里取任务执行
  • 任务处理线程需要有一个标记,标记线程什么时候应该停止
  • 实现任务处理线程
    • 基本属性(任务队列、标记)
    • 线程执行的逻辑
    • 线程停止(stop)

2、编程实现

pool.py

来源:An宁

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月24日
下一篇 2020年7月24日

相关推荐