1 引言
首先区分几个概念:
程序——能被计算机执行的文件;
进程——处于执行状态的程序,包含计算机为其分配的空间、内存、数据栈等资源;
线程——也称轻量级进程(迷你进程),在同一进程下执行,拥有相同的上下文(线程间消息传递更方便);可以认为他们是在同一主进程或“主线程”中并行运行的一些“迷你进程”。
从上面的概念可以发现:
针对能够采用多线程编程的任务,如一个进程可以拆解为多个并发执行的子任务的情况,其效率肯定比单进程顺序执行的效率高。但是,由于多线程在同一上下文环境下执行,对一些公用资源会出现竞争的情况,如何解决些问题?
这就是贯穿本章的两个重点:
- 如何实现多线程编程?(需要用哪些模块的那些方法?)
- 如何解决资源的同步问题?(即锁的问题。)
2 几种多线程编程实现方法
常见多线程编程的实现方法包括:
- thread模块实现;
- threading模块实现;
2.1 thread模块的多线程实现
-
首先,看看最基本的多线程实现。
上面程序中之所以要加sleep(6)
是因为thread模块中没有守护进程,导致最先执行完的进程结束后,整个程序会退出。这也是推荐用threading模块的主因。
在每个程序中添加sleep(6)
这样的等待函数显然不合适,我们再看看加上锁以后的一个改进版本。 -
thread模块中锁的使用
2.2 thread模块的多线程实现
- 方法一:创建Thread的实例,传给它一个函数。
- 方法二:创建Thread的实例,传给它一个实例。
- 方法三:派生Thread的子类,再将子类实例化。
3 同步原语的几种形式
- 锁Lock;
- 信号量(计数器)方法实现;
- Queue模块实现;
3.1 锁Lock
3.2 信号量(计数器)的使用
3.3 Queue模块队列的应用
4 总结
扯了这么久,多线程到底是个什么东西?
简而言之:
如果要执行某个算法或函数,单线程会顺序的执行其中的每一步,直至结束;多线程可以同时执行多个算法或函数,这样效率就更高。