1、说点儿题外话
记得刚毕业那会儿,老是喜欢研究各种其他的新的技术性的东西,可能今天还在 hadoop 的分布式明天又去准备了解 python 的机器学习。慢慢的了解过很多东西,除了 java 之外,对 scala、C#、python、shell 等都有粗浅的了解,但是真正让我写一个东西拿到生产环境或是作为一个正式的项目说实话有点难。其实,到了编程3年以后我觉得对技术的深度要比宽度更重要一些,所以,我现在主要写一些 java、python 相关的东西,其他的语言不准备碰了。
2、每天都在接触多线程
现在,很多项目中的多线程都是通过容器或是中间件来完成的。比如说,最常见的就是 web 项目容器,在 web-2.0 以来,很多项目更是从其他的地方挪到了 web 服务器,使用浏览器就可以方便的访问。在 web 容器中基本都封装了对多线程的支持,nginx 服务更是以进程为导向进行设计的,它们以用户的请求为导向使用中间件划分为多线程的请求模式。除了架构或是运维人员会注意这些,其他的开发人员面对繁重的开发任务又怎么会注意到这些呢。所以,面对这种情况在日常开发中如果不是主动研究根本不会要求你写一个多线程、高并发的需求。
3、python 中的多线程
在说明之前先回顾一下理论知识,搞清楚线程是什么以及应该注意什么。多线程:理论上能在同一个时间段执行多个程序片段,每个程序片段就看作是一个线程。为什么要说理论上,因为实际在操作系统中真正的在同一时间段基本是不存在的,但是在软件编程中我们可以理解为它是在同一时间段执行的。同步:在多个线程同时执行到一个对象节点时,同时执行会使这个对象发生冲突,因此,在一个线程执行到这里的时候另外其他的线程也要处理这个对象时则需要等待,这样称之为同步。反之,则称之为异步。通常,遇到需要同步的情况,不同的编程语言都选择通过加锁的方式来实现同步,python 亦是如此。
在 python 语言中提供了两个和多线程线程相关的模块,一个是 thread 模块、另一个是 threading 模块。相比于 threading 模块,thread 模块提供的功能和函数相对比较少,它只提供了低级别的线程和一个简单的锁用来做同步,而 threading 模块相对处理多线程的函数比较多。
4、thread 模块如何实现多线程
- 创建使用线程
1# 导入 thread 模块
2import thread
3# 创建使用新线程
4thread.start_new_thread ( func, args[, kwargs] )
5# 参数介绍
6func -- 线程要执行的函数
7args -- 传递给线程的参数,必须是元组类型
8kwargs -- 可选参数
- 线程同步
1# 导入 thread 模块
2import thread
3# 分配锁对象
4lock_ = thread.allocate_lock()
5# 获取锁对象
6lock_.acquire()
7# 释放锁对象
8lock_.release()
9# 查看锁状态
10lock_.locked()
- 实例
1# 导入 thread 模块
2import thread
3import time
4
5
6# 定义线程函数
7def time_run(thread_name, sleep_time, lock_obj):
8 print "添加锁"
9 lock_obj.acquire()
10 print "当前线程名称:", thread_name
11 print "等待时间:",sleep_time
12 time.sleep(sleep_time)
13 print "释放锁"
14 lock_obj.release()
15
16
17if __name__ == '__main__':
18 lock_ = thread.allocate_lock()
19 for i in range(3):
20 thread.start_new_thread(time_run,('thread_' + str(i),int(i) * 3,lock_))
5、threading 模块如何实现多线程
- 创建使用线程
1# 导入 threading 模块
2import threading
3import time
4# threading 模块中提供了比较强大的线程类 Thread 来实现对线程的独立管理
5# 通过继承该 Thread 类实现自定义的线程类
6
7# 创建自定义线程类
8class cust_thread(threading.Thread):
9 # 初始化线程实例
10 def __init__(self,thread_id,thread_name,sleep_time):
11 # 初始化
12 threading.Thread.__init__(self)
13 # 属性赋值
14 self.thread_id = thread_id
15 self.thread_name = thread_name
16 self.sleep_time = sleep_time
17
18 # 线程函数
19 def run(self):
20 print "当前线程:",self.thread_name
21 print "等待时间:",self.sleep_time
22 time.sleep(self.sleep_time)
23# 创建线程实例
24thread_1 = cust_thread(0,"线程_1",3)
25thread_2 = cust_thread(1, "线程_2", 5)
- 线程同步
1# 导入 threading 模块
2import threading
3# threading 模块使用 Lock() 函数提供锁的支持
4# 获取锁对象
5lock_ = threading.Lock()
6# 加锁
7lock_.acquire()
8# 释放锁
9lock_.release()
除了使用锁的形式实现线程同步,也可以使用使用 python 模块中的队列的形式来实现对线程同步的控制。
- 实例
1# -*- coding: UTF-8 -*-
2
3# 导入 threading 模块
4import threading
5import time
6# threading 模块中提供了比较强大的线程类 Thread 来实现对线程的独立管理
7# 通过继承该 Thread 类实现自定义的线程类
8
9# 创建自定义线程类
10class cust_thread(threading.Thread):
11 # 初始化线程实例
12 def __init__(self,thread_id,thread_name,sleep_time,lock_obj):
13 # 初始化
14 threading.Thread.__init__(self)
15 # 属性赋值
16 self.thread_id = thread_id
17 self.thread_name = thread_name
18 self.sleep_time = sleep_time
19 self.lock_obj = lock_obj
20
21 # 线程函数
22 def run(self):
23 self.lock_obj.acquire()
24 print "当前线程:",self.thread_name
25 print "等待时间:",self.sleep_time
26 time.sleep(self.sleep_time)
27 self.lock_obj.release()
28
29
30if __name__ == '__main__':
31 lock_obj = threading.Lock()
32 thread_1 = cust_thread(0,"线程_1",3,lock_obj)
33 thread_2 = cust_thread(1, "线程_2", 5,lock_obj)
34 # 启动线程
35 thread_1.start()
36 thread_2.start()
37 # 守护线程执行完毕
38 thread_1.join()
39 thread_2.join()
40 print "完成所有线程执行"
更多精彩前往微信公众号【Python 集中营】,关注获取《python 从入门到精通全套视频》