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编写爬虫小程序
May 14 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
python中的itertools的使用详解
Jan 13 Python
python 获取字典键值对的实现
Nov 12 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 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
模仿OSO的论坛(三)
2006/10/09 PHP
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
Python yield使用方法示例
2013/12/04 Python
python和C语言混合编程实例
2014/06/04 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
微信小程序python用户认证的实现
2019/07/29 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
机电一体化专业推荐信
2013/12/03 职场文书
参观接待方案
2014/03/17 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
校园安全广播稿范文
2014/09/25 职场文书
语文复习计划
2015/01/19 职场文书
大专护理专业自荐信
2015/03/25 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python