Python并发班

一、阶段一:线程的实现

线程模块
Python通过两个标准库_thread 和threading
提供对线程的支持 , threading对_thread进行了封装。
threading模块中提供了Thread , Lock , RLock , Condition等组件。
因此在实际的使用中我们一般都是使用threading

Thread类
在这里插入图片描述
在这里插入图片描述

创建线程
在python中创建线程有两种方式,实例Thread类和继承重写Thread类
实例Thread类
在这里插入图片描述
创建线程
继承Thread类
在这里插入图片描述
Join & setDaemon
在说这两个方法之前 , 需要知道主线程与子线程的概念

主线程 : 当一个程序启动时 , 就有一个线程开始运行 , 该线程通常叫做程序的主线程

子线程 : 因为程序是开始时就执行的 , 如果你需要再创建线程 , 那么创建的线程就是这个主线程的子线程

主线程的重要性体现在两方面 :

  1. 是产生其他子线程的线程
  2. 通常它必须最后完成执行比如执行各种关闭操作
    join : 阻塞调用程序 , 直到调用join () 方法的线程执行结束, 才会继续往下执行
    在这里插入图片描述
    setDaemon() 与 join() 基本上是相对的 , join会等子线程执行完毕 ; 而setDaemon则不会等
    在这里插入图片描述

二、阶段二:线程间的通信

互斥锁
在多线程中 , 所有全局变量对于所有线程都是共享的 , 因此 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了 , 所以我们需要互斥锁 , 来锁住数据。

线程间全局变量的共享

在这里插入图片描述
提示!
因为线程属于同一个进程,因此它们之间共享内存区域。
因此全局变量是公共的。

共享内存间存在竞争问题

在这里插入图片描述
在这里插入图片描述
使用锁来控制共享资源的访问
在这里插入图片描述

在这里插入图片描述
队列的基本概念
一个入口,一个出口
先入先出(FIFO)

在这里插入图片描述

线程安全队列操作一览
入队: put(item)
出队: get()
测试空: empty() # 近似
测试满: full() # 近似
队列长度: qsize() # 近似
任务结束: task_done()
等待完成: join()

三、阶段三:线程池

池的概念

在这里插入图片描述
主线程: 相当于生产者,只管向线程池提交任务。
并不关心线程池是如何执行任务的。
因此,并不关心是哪一个线程执行的这个任务。
线程池: 相当于消费者,负责接收任务,
并将任务分配到一个空闲的线程中去执行。

线程池的简单实现

在这里插入图片描述
效果演示
在这里插入图片描述

在这里插入图片描述
python内置线程池

在这里插入图片描述

池的其他操作
操作一: close - 关闭提交通道,不允许再提交任务
操作二: terminate - 中止线程池,中止所有任务

展开阅读全文

没有更多推荐了,返回首页