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基础之入门必看操作
Jul 26 Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
python实现类之间的方法互相调用
Apr 29 Python
Sanic框架应用部署方法详解
Jul 18 Python
python将控制台输出保存至文件的方法
Jan 07 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
python中Django文件上传方法详解
Aug 05 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 动态多文件上传
2009/01/18 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
解析crontab php自动运行的方法
2013/06/24 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
jQuery异步提交表单实例
2017/05/30 jQuery
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
对python append 与浅拷贝的实例讲解
2018/05/04 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
淘宝网店营销策划书
2014/01/11 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
协议书模板
2014/04/23 职场文书
团支部推优材料
2014/05/21 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书