python之潜心研究多线程(thread模块) 建议使用threading模块

简介:

一、普通的顺序执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from  time  import  sleep, ctime
 
def  loop0():
     print  "start loop 0 at:" , ctime()
     sleep( 4 )
     print  "loop 0 done at:" , ctime()
 
def  loop1():
     print  "start loop 1 at:" , ctime()
     sleep( 2 )
     print  "loop 1 done at:" , ctime()
 
def  main():
     print  "start at:" , ctime()
     loop0()
     loop1()
     print  "all DONE at:" , ctime()
 
if  __name__  = =  '__main__' :
     main()

执行结果
/usr/bin/python2.7 /home/toby/PycharmProjects/SOMS/test.py
start at: Tue Feb 28 20:57:02 2017
start loop 0 at: Tue Feb 28 20:57:02 2017
loop 0 done at: Tue Feb 28 20:57:06 2017
start loop 1 at: Tue Feb 28 20:57:06 2017
loop 1 done at: Tue Feb 28 20:57:08 2017
all DONE at: Tue Feb 28 20:57:08 2017


从结果来看所需要的时间为6秒


二、用线程执行(thread模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import  thread
from  time  import  sleep, ctime
 
 
def  loop0():
     print  "start loop 0 at:" , ctime()
     sleep( 4 )
     print  "loop 0 done at:" , ctime()
 
def  loop1():
     print  "start loop 1 at:" , ctime()
     sleep( 2 )
     print  "loop 1 done at:" , ctime()
 
def  main():
     print  "start at:" , ctime()
     thread.start_new_thread(loop0,())
     thread.start_new_thread(loop1,())
     sleep( 6 )
     print  "all DONE at:" , ctime()
 
if  __name__  = =  '__main__' :
     main()

执行结果:

/usr/bin/python2.7 /home/toby/PycharmProjects/SOMS/test.py
start at: Tue Feb 28 21:19:07 2017
start loop 0 at: Tue Feb 28 21:19:07 2017
start loop 1 at: Tue Feb 28 21:19:07 2017
loop 1 done at: Tue Feb 28 21:19:09 2017
loop 0 done at: Tue Feb 28 21:19:11 2017
all DONE at: Tue Feb 28 21:19:13 2017

从结果来看,函数loop0和loop1是在统一时间(21:19:07)启动,也就是并发执行。函数loop0等待时间为4秒,loop1等待时间为2秒,所以总的运行时间被缩短了,运行了两个函数花了4秒的时间。看看sleep(6),使用了这样的一种愚蠢的方式来做线程同步机制,之所以是6,是因为我们已经知道了一个是4秒,一个是2秒,所以主线程等待6秒,那么两个函数也就都执行完了,否则,会发生子线程还没执行完,主线程就退出了。那么这是不能容忍的



三、使用线程和锁

如果,每一个线程的运行时间不能确定。那么如何解决?难道要让主线程过早或过晚的退出吗?解决上面那个愚蠢的问题(线程同步),就引用锁(GIL)来解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#_*_coding:utf-8_*_
import  thread
from  time  import  sleep,ctime
 
#秒数
loops  =  [ 4 , 2 ]
 
#这个函数是模拟一个实实在在是用来干活的函数
def  loop(nloop,nsec,lock):
     print  "函数%s 启动时间:%s 等待秒数:%s 获得的锁:%s\n"  % (nloop,ctime(),nsec,lock)
     sleep(nsec)  #等待时间
     lock.release()   #释放锁
 
def  main():
     print  "主线程在 %s 开始启动...:"  %  ctime()
     locks  =  []  #这个列表用来存放获得的锁
     nloops  =  range ( len (loops))   #把全局变量中的loops列表引进来,所生成的局部变量nloops作为索引
     #顾nloops存储的是[0,1,2]
 
     #创建锁
     for  in  nloops:
         lock  =  thread.allocate_lock()  #创建一个锁的列表
         lock.acquire()  #获得锁
         locks.append(lock)  #把锁放到locks列表中
 
     #创建线程
     for  in  nloops:
         thread.start_new_thread(loop,(i,loops[i],locks[i]))  #启动线程执行loop函数,i为循环编号,loops[i]为秒数,locks[i]为锁
 
     #这个循环处于等待,达到暂停主线程的目的
     #只要locks列表中存在锁,那么就是为true,所以会执行while循环,但是这个循环是pass,意思是啥都不干,只是空等着
     for  in  nloops:
         while  locks[i].locked():
             pass
 
     print  "所有函数完成时间:" , ctime()
 
if  __name__  = =  '__main__' :
         main()

执行结果:

"D:\Program Files (x86)\Python27\python27.exe" E:/PycharmProjects/test.py
主线程在 Wed Mar 01 12:52:03 2017 开始启动...:
函数0 启动时间:Wed Mar 01 12:52:03 2017 等待秒数:4 获得的锁:<thread.lock object at 0x0000000002C2E130>
函数1 启动时间:Wed Mar 01 12:52:03 2017 等待秒数:2 获得的锁:<thread.lock object at 0x0000000002C2E110>

所有函数完成时间: Wed Mar 01 12:52:07 2017



最后。。。

建议使用threading模块,这里建议使用thread模块仅作为研究之用。



本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/1902285
相关文章
|
6月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
773 7
|
6月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
509 0
|
6月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。
|
6月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
571 4
|
7月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
232 4
|
6月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
651 0
|
6月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
808 0
|
7月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
622 0
|
7月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1097 102

热门文章

最新文章

推荐镜像

更多
下一篇
开通oss服务