乐趣区

关于python:大话-Pythonpython-进阶提升-多线程高并发离我们真的那么远吗

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 从入门到精通全套视频》

退出移动版