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使用matplotlib简单绘图示例
Feb 01 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
Django中如何使用sass的方法步骤
Jul 09 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
python调用matplotlib模块绘制柱状图
Oct 18 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
详解python破解zip文件密码的方法
Jan 13 Python
基于Tensorflow高阶读写教程
Feb 10 Python
python各种excel写入方式的速度对比
Nov 10 Python
python subprocess pipe 实时输出日志的操作
Dec 05 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检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
年度考核自我评价
2014/01/25 职场文书
药店采购员岗位职责
2014/09/30 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
python tkinter模块的简单使用
2021/04/07 Python
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
详解vue中v-for的key唯一性
2021/05/15 Vue.js
Python中requests做接口测试的方法
2021/05/30 Python