综述
Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。
在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。
在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能:
实现模块
- thread:多线程的底层支持模块,一般不建议使用;
- threading:对thread进行了封装,将一些线程的操作对象化
threading模块
- Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能;
- Timer与Thread类似,但要等待一段时间后才开始运行;
- Lock 锁原语,这个我们可以对全局变量互斥时使用;
- RLock 可重入锁,使单线程可以再次获得已经获得的锁;
- Condition 条件变量,能让一个线程停下来,等待其他线程满足某个“条件”;
- Event 通用的条件变量。多个线程可以等待某个事件发生,在事件发生后,所有的线程都被激活;
- Semaphore为等待锁的线程提供一个类似“等候室”的结构;
- BoundedSemaphore 与semaphore类似,但不允许超过初始值;
- Queue:实现了多生产者(Producer)、多消费者(Consumer)的队列,支持锁原语,能够在多个线程之间提供很好的同步支持。
其中Thread类
- 是你主要的线程类,可以创建进程实例。该类提供的函数包括:
- getName(self) 返回线程的名字
- isAlive(self) 布尔标志,表示这个线程是否还在运行中
- isDaemon(self) 返回线程的daemon标志
- join(self, timeout=None) 程序挂起,直到线程结束,如果给出timeout,则最多阻塞timeout秒
- run(self) 定义线程的功能函数
- setDaemon(self, daemonic) 把线程的daemon标志设为daemonic
- setName(self, name) 设置线程的名字
- start(self) 开始线程执行
其中Queue提供的类
- Queue队列
- LifoQueue后入先出(LIFO)队列
- PriorityQueue 优先队列
接下来,我们将会用一个一个示例来展示threading的各个功能,包括但不限于:两种方式起线程、threading.Thread类的重要函数、使用Lock互斥及RLock实现重入锁、使用Condition实现生产者和消费者模型、使用Event和Semaphore多线程通信
两种方式起线程
在Python中我们主要是通过thread和threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用threading模块实现多线程编程。一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。
将函数传递进Thread对象:
import threading
def thread_fun(num):
for n in range(0, int(num)):
print " I come from %s, num: %s" %( threading.currentThread().getName(), n)
def main(thread_num):
thread_list = list();
# 先创建线程对象
for i in range(0, thread_num):
thread_name = "thread_%s" %i
thread_list.append(threading.Thread(target = thread_fun, name = thread_name, args = (20,)))
# 启动所有线程
for thread in thread_list:
thread.start()
# 主线程中等待所有子线程退出
for thread in thread_list:
thread.join()
if __name__ == "__main__":
main(3)