并发:多个任务同一时间段进行python
并行:多个任务同一时刻进行安全
线程的实现多线程
线程模块并发
Python经过两个标准库_thread 和threading,提供对线程的支持 , threading对_thread进行了封装函数
所以在实际的使用中咱们通常都是使用threading测试
threading模块中提供了Thread , Lock , RLock , Condition等组件ui
Thread类spa
经常使用参数线程
target 表示调用对象,即子线程要执行的任务3d
name 子线程的名称
args 传入target函数中的位置参数,是一个元组,参数后必须加逗号
经常使用实例方法
Thread.run (self) 线程启动时运行的方法,由该方法调用target参数所指定的函数
Thread.start (self) 启动进程,start方法就是去帮你调用run方法
Thread.terminate (self) 强制终止线程
Thread.join (self, timeout=None) 阻塞调用,主线程进行等待
Thread.setDaemon (self,daemonic) 将子线程设置为守护线程
Thread.getName(self,name) 获取线程名称
Thread.setName (self,name ) 设置线程名称
建立线程
实例Thread类
继承Thread类
Join & setDaemon
主线程 : 当一个程序启动时 , 就有一个线程开始运行 , 该线程一般叫作程序的主线程
子线程 : 由于程序是开始时就执行的 , 若是你须要再建立线程 , 那么建立的线程就是这个主线程的子线程
主线程的重要性体如今两方面 :
1. 是产生其余子线程的线程
2. 一般它必须最后完成执行好比执行各类关闭操做
join : 阻塞调用程序 , 直到调用join () 方法的线程执行结束, 才会继续往下执行
setDaemon() 与 join() 基本上是相对的 , join会等子线程执行完毕 ; 而setDaemon则不会等,主线程结束,则所有结束
线程通讯
锁
在多线程中 , 全部变量对于全部线程都是共享的
所以 , 线程之间共享数据最大的危险在于多个线程同时修改一个变量 , 那就乱套了
因此咱们须要互斥锁 , 来锁住数据
线程间全局变量的共享
由于线程属于同一个进程,所以它们之间共享内存区域,因此全局变量是公共的
共享内存间存在竞争问题
在这里进行原子操做(取值、运算、赋值)的时候切换到了其它线程,一个线程还没赋值,另外的线程就已经给它赋值了,而后又切回来继续赋值
使用锁来控制共享资源的访问
加锁:Lock对象.acquire()
解锁:Lock对象.release()
队列的基本概念
一个入口,一个出口,先入先出(FIFO)
线程安全队列、操做一览
入队: put(item)
出队: get()
测试空: empty()
测试满: full()
队列长度: qsize()
任务结束: task_done()
等待完成: join()
线程池
池的概念
主线程:至关于生产者,只管向线程池提交任务,并不关心线程池是如何执行任务的,所以,也不关心是哪个线程执行的这个任务
线程池:至关于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行
线程池的简单实现
python内置线程池
池的其余操做
操做一: close - 关闭提交通道,不容许再提交任务
操做二: terminate - 停止进程池,停止全部任务