thread 模块

1. 单线程

首先看下单线程程序运行的例子,如下所示,

import timedef loop0():print 'start loop0 begin', time.ctime()time.sleep(4)print 'start loop0 end', time.ctime()def loop1():print 'start loop1 begin', time.ctime()time.sleep(2)print 'start loop1 end', time.ctime()def main():print 'main is start', time.ctime()loop0()loop1()print 'main is end', time.ctime()if __name__ == '__main__':main()

程序运行结果如下:

'''
main is start Sat Jul 21 19:47:41 2018
start loop0 begin Sat Jul 21 19:47:41 2018
start loop0 end Sat Jul 21 19:47:45 2018
start loop1 begin Sat Jul 21 19:47:45 2018
start loop1 end Sat Jul 21 19:47:47 2018
main is end Sat Jul 21 19:47:47 2018
'''

从运行结果可以看出,函数是按照顺序依次执行。运行总时间是各个函数运行的时间总和。

2. 简单多线程

简单多线程我们先使用 thread 模块,下面看个简单示例

import thread
import timedef loop0():print 'loop0 begin', time.ctime()time.sleep(4)print 'loop0 end', time.ctime()def loop1():print 'loop1 begin', time.ctime()time.sleep(2)print 'loop1 end', time.ctime()def main():print 'main is start', time.ctime()thread.start_new_thread(loop0, ())  # 第一个参数为函数,第二个参数为元组,即使是空值也要写成空的元组thread.start_new_thread(loop1, ())time.sleep(6)    # 保障其他线程执行完毕后再关闭主进程,此处我们知道最长是6s,如果不知道就需要使用锁print 'main is end', time.ctime()if __name__ == '__main__':main()

程序运行结果如下:

'''
main is start Sat Jul 21 19:56:50 2018
loop0 begin Sat Jul 21 19:56:50 2018
loop1 begin Sat Jul 21 19:56:50 2018
loop1 end Sat Jul 21 19:56:52 2018
loop0 end Sat Jul 21 19:56:54 2018
main is end Sat Jul 21 19:56:56 2018
'''

从运行结果可以看出,loop0 和 loop1 两个函数是并行运行的,程序中的 time.sleep(6) 是由于要保障其他线程执行完毕后再关闭主进程,此处我们知道最长是 6s,如果不知道就需要使用锁。

3. 使用简单锁

在本程序中,我们使用简单的锁来让主进程动态地等待子线程执行结束再结束主进程。

import thread
import timeloops = [4, 2]def loop(nloop, nsec, lock):print 'start loop', nloop, 'at:', time.ctime()time.sleep(nsec)print 'stop loop', nloop, 'at:', time.ctime()lock.release()  # 释放相应的锁,通知主线程该线程已经退出了def main():print 'main is start at:', time.ctime()locks = []nloops = range(len(loops))for i in nloops:lock = thread.allocate_lock()   # 创建一个锁列表lock.acquire()  # 分别调用acquire获得锁locks.append(lock)for i in nloops:    # 循环创建线程,放到上面循环之后是因为:获取锁需要一段时间,有可能出现还没有获得锁,线程就结束的情况thread.start_new_thread(loop,(i, loops[i], locks[i]))for i in nloops:while locks[i].locked():passprint 'main is end at:', time.ctime()if __name__ == '__main__':main()

程序运行结果如下:

'''
main is start at: Sat Jul 21 20:07:08 2018
start loop 0 at: Sat Jul 21 20:07:08 2018
start loop 1 at: Sat Jul 21 20:07:08 2018
stop loop 1 at: Sat Jul 21 20:07:10 2018
stop loop 0 at: Sat Jul 21 20:07:12 2018
main is end at: Sat Jul 21 20:07:12 2018
'''

Python 多线程总结(1)- thread 模块相关推荐

  1. python 多线程编程之_thread模块

    python 多线程编程之_thread模块 参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁 ...

  2. python 多线程 setdaemon_python使用Thread的setDaemon启动后台线程教程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon( ...

  3. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析

    本文研究的主要是Python多线程threading和multiprocessing模块的相关内容,具体介绍如下. 线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器.栈指针)以及堆栈组 ...

  4. python多线程,多进程,线程池,进程池

    https://blog.csdn.net/somezz/article/details/80963760 python 多线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单 ...

  5. python多进程编程_【玩树莓】编程篇(八)Python多线程、多进程编程

    1.多任务编程 除了计算性能和图形显示以外,树莓派区别于Arduino的一大特点就是运行多任务操作系统.通过多任务系统用户可以同时执行多个互相独立的程序(任务),来完成不同的操作. 利用Python的 ...

  6. Python实战之多线程编程thread模块

    Python实战之多线程编程thread模块 在Python中除了可以通过继承threading.Thread类来实现多线程外,也可以调用thread模块中的start_new_thread()函数来 ...

  7. Python多线程编程---(1)threading 模块 Thread 类

    全文参考:Python多线程编程(一):threading 模块 Thread 类的用法详解_frank 的专栏-CSDN博客 最近看了下团队自动化测试用例的代码,里面有涉及并行处理的逻辑,主要是基于 ...

  8. Python多线程编程(一):threading 模块 Thread 类的用法详解

    我们进行程序开发的时候,肯定避免不了要处理并发的情况. 一般并发的手段有采用多进程和多线程. 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况. Python 提 ...

  9. python实现多线程的三种方法threading.Thread(模块)的继承实现和函数实现;以及concurrent.futures模块的线程池实现

    1.threading.Thread模块继承实现: import threading import timeclass TestThread(threading.Thread):def __init_ ...

最新文章

  1. java int byte数组_Java 中int与byte数组转换详解
  2. python桌面图形_Python桌面图形程序美化的方法论
  3. 高通要大干无人机芯片 耗时一年获总部飞行许可
  4. python全栈开发_day10_函数的实参和形参
  5. vue底部跳转_Vue中底部tabBar切换及跳转
  6. SQL Server | Mysql 对表的unique 的实现方式
  7. matlab基础视频教程解压密码,价值上千元的MATLAB基础视频教程附源码请收下!
  8. SSM项目实战之博客系统
  9. 测试@Test启动报错解决方案
  10. android 剪切并上传图片
  11. Pencil:开源的GUI原型设计工具
  12. echarts设置tooltips样式以及调取数据
  13. Linux安装Perl(最新版)
  14. 大数据查询引擎 PrestoDB
  15. ROS高效入门第一章 -- ROS历史与现状
  16. poj-2905 The Pilots Brothers' refrigerator
  17. 家到学校路线图怎么画_从家到学校的详细地图这样画
  18. 应对考试的计算程序复杂度。。。欸
  19. EtherCAT是如何工作的
  20. js实现TODOlist

热门文章

  1. curl模拟post请求
  2. scikit-learn - 分类模型的评估 (classification_report)
  3. 超轻量AI引擎MindSpore Lite
  4. TensorFlow中的语义分割套件
  5. TensorRT 3:更快的TensorFlow推理和Volta支持
  6. 用NVIDIA-NGC对BERT进行训练和微调
  7. CVPR2020论文介绍: 3D 目标检测高效算法
  8. Python 代理爬取网站数据
  9. Redis持久化 - RDB和AOF
  10. Android 接入Realm并使用