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异常学习笔记
Feb 03 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
Python获取央视节目单的实现代码
Jul 25 Python
python写一个md5解密器示例
Feb 23 Python
Django REST framework视图的用法
Jan 16 Python
Python适配器模式代码实现解析
Aug 02 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
python自动下载图片的方法示例
Mar 25 Python
python实现贪吃蛇双人大战
Apr 18 Python
Python内置函数及功能简介汇总
Oct 13 Python
python 生成正态分布数据,并绘图和解析
Dec 21 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
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
php计算一个文件大小的方法
2015/03/30 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JS的反射问题
2010/04/07 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python构建指数平滑预测模型示例
2019/11/21 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
pandas apply多线程实现代码
2020/08/17 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
日语求职信范文
2013/12/17 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
2019各种保证书范文
2019/06/24 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript