python多线程的实现方法总结
- 本篇文章介绍支持python多线程编程的模块及其使用方法,主要有thread,threading,Queue,multiprocessing等 - 关于多线程编程的适用环境以及和多进程编程的区别,可查看[https://www.cnblogs.com/liushi-Oscar/p/9636051.html](https://www.cnblogs.com/liushi-Oscar/p/9636051.html)
thread 模块
- thread模块在官方的介绍中并不推荐使用,原因在于thread模块对进程的退出没有控制,只有较少的同步原语等,因此这里不花太多时间介绍了
- 其包含的功能可以使用更高级的threading模块实现
threading 模块
- Thread 类
- 多线程的实现主要用Thread类来执行,该类包含多种常用的方法
__init__(target=None,args=(),kwargs={},group=None,name=None,daemon=None)
- 实现一个线程的实例,前两个参数常用,后几个参数很少用到
start()
- 开始执行这个线程
- join(timeout=None)
- 设置该线程最长执行时间。
- 如果线程执行完成,正常退出并且返回
- 如果线程处于挂起状态(阻塞),则最多阻塞timeout时长(单位s),如未设置,则一直处于阻塞中
- is_alive()
- 该线程是否还存活,是,返回True,否返回False
- 简单示例:
for i in range(count):
t = threading.Thread(target=loop,args=(i,)) #loop为线程执行的函数名
theads.append(t)
for thead in theads:
thead.start()
for thead in theads:
thead.join() -
- 多线程的实现主要用Thread类来执行,该类包含多种常用的方法
## Queue 模块
- Queue是什么?能干什么?怎么实现?
- 是一个提供线程间的通信机制的模块
- 让线程之间可以分享数据
- 创建一个队列,让生产者(线程)在其中放入新的商品(数据),而消费者(线程)消费这些商品(数据)
- Queue模块属性
- **Queue(maxsize=0)**
- 创建一个先入先出的队列
- 如给定maxsize,则在队列没有空间时阻塞;否则,为无限队列
- LifoQueue(maxsize=0)
- 创建一个后入先出的队列
- PriorityQueue(maxsize=0)
- 创建一个优先级队列
- **Queue队列异常**
- Empty
- 当队列为空时,仍用get()方法时,抛出Empty异常
- Full
- 当队列已满时,仍用pull()方法时,抛出Full异常
- **Queue实例方法**
- qsize()
- 返回队列大小
- empty()
- 返回队列是否为空。是True,否False
- full()
- 返回队列是否已满。是True,否False
- **put(item,block=True,timeout=None)**
- 将item放入队列
- block为True,在队列已满时阻塞;False,空间已满时抛出Full异常
- timeout,如果阻塞,则最多阻塞时长
- **get(block=True, timeout=None)**
- 取出队列数据
- task_done()
- join()
## multiprocessing 模块
- multiprocessing主要为多进程处理模块,与多线程的区别可参考[https://www.cnblogs.com/liushi-Oscar/p/9636051.html](https://www.cnblogs.com/liushi-Oscar/p/9636051.html)
- 多线程适合I/O密集型,多进程更适合计算密集型
- Process类
- Process的使用方法和threading.Thread类基本相同,前者实现多进程。主要方法简写如下:
- Process([target [, name [, args [, kwargs]]]])
- target: 要执行的方法;
- name: 进程名;
- args/kwargs: 要传入方法的参数。
- 实例方法:
- is_alive():返回进程是否在运行。
- join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
- start():进程准备就绪,等待CPU调度。
- run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。
- terminate():不管任务是否完成,立即停止工作进程。
- 属性:
- daemon:和线程的setDeamon功能一样(将父进程设置为守护进程,当父进程结束时,子进程也结束)。
- exitcode(进程在运行时为None、如果为–N,表示被信号N结束)。
- name:进程名字。
- pid:进程号。
- Queue类
- 和上述Queue模块使用方法基本类似
- 只适用于Process类
- Pool类
- 待更新