Python多线程thread及模块使用实例


Posted in Python onApril 28, 2020

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

线程可以被抢占(中断)。

在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

线程可以分为:

内核线程:由操作系统内核创建和撤销。

用户线程:不需要内核支持而在用户程序中实现的线程。

Python3 线程中常用的两个模块为:

  • _thread
  • threading(推荐使用)

thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3

将 thread 重命名为 "_thread"。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下:

_thread.start_new_thread ( function, args[, kwargs] )

参数说明:

  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个tuple类型。
  • kwargs - 可选参数。
import _thread
from time import sleep
import datetime

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop_one():
  print('++++线程一开始于:',date_time_str())
  print('++++线程一休眠4秒')
  sleep(4)
  print('++++线程一休眠结束,结束于:',date_time_str())
      
def loop_two():
  print('++++线程二开始于:',date_time_str())
  print('++++线程二休眠2秒')
  sleep(2)
  print('++++线程二休眠结束,结束于:',date_time_str())
      
def main():
  print('-----所有线程开始时间:',date_time_str())
  _thread.start_new_thread(loop_one,())
  _thread.start_new_thread(loop_two,())
  sleep(6)
  print('------所有线程结束时间:',date_time_str())
      
if __name__=='__main__':
  main()

运行结果:

[python@master thread]$ python3 thread.py
-----所有线程开始时间: 2018-11-08 19:07:54
++++线程一开始于: 2018-11-08 19:07:54
++++线程一休眠4秒
++++线程二开始于: 2018-11-08 19:07:54
++++线程二休眠2秒
++++线程二休眠结束,结束于: 2018-11-08 19:07:56
++++线程一休眠结束,结束于: 2018-11-08 19:07:58
------所有线程结束时间: 2018-11-08 19:08:00

sleep(6) 是让主线程停下来,主线程一旦运行结束,就关闭运行着的其他两个线程,这可能造成主线程过早或者过晚退出,这时就要用线程锁,主线程可认在两个子进程都退出后立即退出。代码如下:

import _thread
from time import sleep
import datetime

loops=[4,2]

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop(n_loop,n_sec,lock):
  print('线程(',n_loop,') 开始执行:',date_time_str(),',先休眠(',n_sec,')秒')
  sleep(n_sec)
  print('线程(',n_loop,')休眠结束,结束于:',date_time_str())
  lock.release()
def main():
  print('---所有线程开始执行...')
  locks=[]
  n_loops=range(len(loops))
  for i in n_loops:
    lock=_thread.allocate_lock()
    lock.acquire()
    locks.append(lock)
  for i in n_loops:
    _thread.start_new_thread(loop,(i,loops[i],locks[i]))
  for i in n_loops:
    while locks[i].locked():
     pass
  print('---所有线程执行结束:',date_time_str())
  
if __name__=='__main__':
  main()

运行结果:

[python@master thread]$ python3 thread2.py
---所有线程开始执行...
线程( 1 ) 开始执行: 2018-11-08 20:00:47 ,先休眠( 2 )秒
线程( 0 ) 开始执行: 2018-11-08 20:00:47 ,先休眠( 4 )秒
线程( 1 )休眠结束,结束于: 2018-11-08 20:00:49
线程( 0 )休眠结束,结束于: 2018-11-08 20:00:51
---所有线程执行结束: 2018-11-08 20:00:51

使用了线程锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
学习python (1)
Oct 31 Python
Python中关于使用模块的基础知识
May 24 Python
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
Django内容增加富文本功能的实例
Oct 17 Python
python requests爬取高德地图数据的实例
Nov 10 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 #Python
Python内置函数locals和globals对比
Apr 28 #Python
使用python实现CGI环境搭建过程解析
Apr 28 #Python
基于python连接oracle导并出数据文件
Apr 28 #Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 #Python
简单了解python shutil模块原理及使用方法
Apr 28 #Python
python脚本监控logstash进程并邮件告警实例
Apr 28 #Python
You might like
《心理测量者3》剧场版动画预告
2020/03/02 日漫
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
工伤事故赔偿协议书
2014/04/15 职场文书
企业指导教师评语
2014/04/28 职场文书
疾病捐款倡议书
2014/05/13 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
毕业论文致谢词
2015/05/14 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
JS数组去重详情
2021/11/07 Javascript