Python多线程threading模块用法实例分析


Posted in Python onMay 22, 2019

本文实例讲述了Python多线程threading模块用法。分享给大家供大家参考,具体如下:

多线程 - threading

python的thread模块是比较底层的模块,python的threading模块对thread做了一些包装,可以更加方便的被使用。

1. 使用threading模块

单线程执行

#coding=utf-8
import time
def saySorry():
  print('跑一圈')
  time.sleep(1)
if __name__ == "__main__":
  for i in range(5):
    saySorry()

运行结果:

跑一圈
跑一圈
跑一圈
跑一圈
跑一圈

多线程执行

#coding=utf-8
import threading
import time
def saySorry():
  print('跑一圈')
  time.sleep(1)
if __name__ == "__main__":
  for i in range(5):
    t = threading.Thread(target=saySorry)
    t.start()#启动线程

运行结果:

跑一圈
跑一圈
跑一圈
跑一圈
跑一圈

说明

①. 通过运行可以明显看出使用多线程并发操作,花费时间要短很多。
②. 创建好的线程,需要调用 start() 方法来启动

2. 主线程会等待所有的子线程结束后才结束

#coding=utf-8
import threading
from time import sleep,ctime,time
def run():
  for i in range(3):
    print('在跑步...%d'%i)
    sleep(1)
def sing():
  for i in range(3):
    print('在唱歌...%d'%i)
    sleep(1)
if __name__ == "__main__":
  print('------start------' + ctime())
  t1 = threading.Thread(target=run)
  t2 = threading.Thread(target=sing)
  t1.start()#启动线程
  t2.start()
  # sleep(5)# 屏蔽此行代码,试试看,程序是否会立即结束?
  print('------stop------' + ctime())

运行结果:

------start------Thu Aug 24 13:38:28 2017
在跑步...0
------stop------Thu Aug 24 13:38:28 2017
在唱歌...0
在跑步...1
在唱歌...1
在跑步...2
在唱歌...2

3. 查看线程数量

#coding=utf-8
import threading
from time import sleep,ctime,time
def run():
  for i in range(3):
    print('在跑步...%d'%i)
    sleep(1)
def sing():
  for i in range(3):
    print('在唱歌...%d'%i)
    sleep(1)
if __name__ == "__main__":
  print('------start------' + ctime())
  t1 = threading.Thread(target=run)
  t2 = threading.Thread(target=sing)
  t1.start()#启动线程
  t2.start()
  while True:
    length = len(threading.enumerate())
    print('当前运行的线程数为:' , length , ctime())
    if length <= 1:
      break
  # sleep(5)# 屏蔽此行代码,试试看,程序是否会立即结束?
  print('------stop------' + ctime())

运行结果:

由于数量庞大,在此不展示。。。。。。

4.线程执行代码的封装 - threading.Thread子类

#coding=utf-8
import threading
import time
class MyThread(threading.Thread):
  def run(self):
    for i in range(3):
      time.sleep(1)
      msg = 'i am '+self.name+'@'+str(i) #name属性中保存的是当前线程的名字
      print(msg)
if __name__ == "__main__":
  t = MyThread()
  t.start()

运行结果:

i am Thread-1@0
i am Thread-1@1
i am Thread-1@2

说明:

python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。在创建自己的线程实例后,通过Thread类的start()方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。

5.线程的执行顺序

#coding=utf-8
import threading
import time
class MyThread(threading.Thread):
  def run(self):
    for i in range(3):
      time.sleep(1)
      msg = 'i am '+self.name+'@'+str(i) #name属性中保存的是当前线程的名字
      print(msg)
def test():
  for i in range(5):
    t = MyThread()
    t.start()
if __name__ == "__main__":
  test()

运行结果:

i am Thread-1@0
i am Thread-2@0
i am Thread-3@0
i am Thread-4@0
i am Thread-5@0
i am Thread-1@1
i am Thread-2@1
i am Thread-3@1
i am Thread-4@1
i am Thread-5@1
i am Thread-1@2
i am Thread-2@2
i am Thread-3@2
i am Thread-4@2
i am Thread-5@2

说明:

(运行的结果可能不一样,但是大体是一致的)

从代码的执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、

run函数中每次循环的执行顺序都不能确定。

总结

1. 每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
2. 当线程的run()方法结束时该线程完成。
3. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。
4. 线程的几种状态

Python多线程threading模块用法实例分析

多线程-共享全局变量

#coding=utf-8
import threading
import time
g_num = 100
def work1():
  global g_num
  for i in range(3):
    g_num+=1
  print('work1 --- num = %d'%g_num)
def work2():
  global g_num
  print('work2 --- num = %d'%g_num)
if __name__ == "__main__":
  print('---start------g_num = %d'%g_num)
  t1 = threading.Thread(target=work1)
  t1.start()
  # 延时一会,保证t1线程中的事情做完
  time.sleep(1)
  t2 = threading.Thread(target=work2)
  t2.start()

运行结果:

---start------g_num = 100
work1 --- num = 103
work2 --- num = 103

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Django 路由系统URLconf的使用
Oct 11 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
python画蝴蝶曲线图的实例
Nov 21 Python
python logging添加filter教程
Dec 24 Python
Pycharm小白级简单使用教程
Jan 08 Python
使用python创建生成动态链接库dll的方法
May 09 Python
Python 创建TCP服务器的方法
Jul 28 Python
python 实现表情识别
Nov 21 Python
理解深度学习之深度学习简介
Apr 14 Python
Python3之手动创建迭代器的实例代码
May 22 #Python
PyTorch搭建一维线性回归模型(二)
May 22 #Python
PyTorch基本数据类型(一)
May 22 #Python
PyTorch搭建多项式回归模型(三)
May 22 #Python
pytorch使用Variable实现线性回归
May 21 #Python
Python面向对象进阶学习
May 21 #Python
谈一谈基于python的面向对象编程基础
May 21 #Python
You might like
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python实现的选择排序算法示例
2017/11/29 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python实现随机漫步功能
2018/07/09 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
印尼旅游网站:via
2017/11/12 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
领导干部作风建设总结
2014/10/23 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
关于vue-router-link选择样式设置
2022/04/30 Vue.js