python核心编程---读书笔记:第18章 多线程编程

 

第18章多线程编程

多线程:异步,子任务独立,并行处理来提升任务效率

使用非阻塞I/O

 

使用多线程变成和共享数据结构Queue

用户请求线程

请求处理器

应答线程

 

18.2线程和进程

进程:程序一次执行过程,有自己地址,内存,数据栈

可通过fork和spawn完成其他任务,使用进程间通讯IPC

 

18.2.2线程

同一进程的线程共享运行环境,并发执行,容易导致不安全

 

18.3Python、线程和全局解释器锁

Python虚拟机执行Python代码,任意时刻,只有一个程序在CPU中运行

全局解释器锁GIL:对Python虚拟机的访问,保证同一时刻只有一个线程运行

执行过程:

1 设置GIL

2切换到一个线程运行

3 运行:

         a:指定指令 或

         b:线程让出控制

4 把线程设置为睡眠状态

5 解锁GIL

6 重复以上所有步骤

 

18.3.2 退出线程

threading模块能确保重要子线程退出,进程才会结束

 

18.3.3 在Python中使用线程

使用能够POSIX兼容的线程pthreads

不要使用thread的原因:主线程结束,子线程被强制结束

 

18.4 thread模块

提供:锁,互斥锁,互斥量

 

start_new_thread(function ,args ,kwargs=None):产生新线程,在新线程中用指定参数和可选的kwargs来调用函数

allocate_lock():分配锁

exit():

 

LockType类型锁对象
acquire(wait=None) : 尝试获取锁对象

locked() :获取锁对象就返回True,否则返回False

release():释放锁

 

18.5 threading模块

Thread:线程执行对象

Lock:锁原语对象

RLock:可重入锁对象,可再次获得已经获得的锁

Condition:条件变量对象能让线程暂停,等待其他线程满足条件,如状态改变

Event:通用条件变量,多线程可等待某时间发生,事件发生,所有线程被激活

Seamphore:为等待的线程提供等候室结构

BoundedSeamphore:不允许超过初始值

Timer:需要等待一段时间后才运行

 

守护线程:threading支持,thread不支持,。

守护线程:等待客户请求的服务器,服务器线程运行在无限循环中

主线程退出,不用等子线程完成,设置线程daemon属性

在thread.start()前,调用setDaemon(True)设定线程

 

18.5.1 Thread类

threading的Thread类是主要的运行对象

创建线程方式:

1、  创建Thread实例,传递给它一个函数

2、  创建Thread实例,传递可调用类对象

3、  从Thread派生子类,创建子类实例

 

Thread对象函数
start():开始执行

run():定义线程功能函数

join(timeout=None):程序挂起,直到线程结束;如果设置timeout,最多阻塞timeout秒

getName():返回线程名字

setName(name):设置线程名字

isAlive():表示线程是否还在运行

isDaemon():返回线程的daemon标志

setDaemon(damonic):把线程的daemon标志设定

 

使用线程韩寒苏:会使用apply()函数

 

18.5.5 threading模块中其他函数
activeCount():返回当前活动线程对象数量

currentThread():返回当前线程对象

enumerate():返回活动线程列表

settrace(func):为线程设置追踪函数

setprofile(func):为线程设置profile函数

 

18.5.5 生产者-消费者问题和Queue模块

Queue模块

qsize():返回队列大小
empty()

full()

put(item , block=0): 如果block不为0,

get(block=0):从队列中获取对象,如果block不为0,函数会一直阻塞到有对象为止。

 

相关模块

mutex:互斥对象
SocketServer:具有线程控制的TCP和UDP管理器

你可能感兴趣的:(python)