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
      • 简单示例:
        theads = []
        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()

## 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类
	- 待更新
原文地址:https://www.cnblogs.com/liushi-Oscar/p/9639768.html