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监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python网站验证码识别
Jan 25 Python
python删除过期log文件操作实例解析
Jan 31 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
Python中创建二维数组
Oct 17 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
Python对象与引用的介绍
Jan 24 Python
django基础学习之send_mail功能
Aug 07 Python
python tkinter基本属性详解
Sep 16 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
如何用python识别滑块验证码中的缺口
Apr 01 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
php date()日期时间函数详解
2010/05/16 PHP
php实现文件编码批量转换
2014/03/10 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
JavaScript基本对象
2007/01/11 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
几个Shell Script面试题
2012/08/31 面试题
毕业生教师求职信
2013/10/20 职场文书
拓展训练激励口号
2014/06/17 职场文书
员工趣味活动方案
2014/08/27 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
网络研修随笔感言
2015/11/18 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python