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中的序列化存储的方法
Apr 28 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
PyQt5每天必学之切换按钮
Aug 20 Python
python实现推箱子游戏
Mar 25 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
python树的同构学习笔记
Sep 14 Python
Django 自动生成api接口文档教程
Nov 19 Python
python图形用户接口实例详解
Dec 16 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
用Python爬取某乎手机APP数据
Jun 15 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
thinkphp实现数组分页示例
2014/04/13 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python中open函数的基本用法示例
2019/09/07 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
爱岗敬业演讲稿范文
2014/01/14 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
高一作文之乐趣
2019/11/21 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
Python Pandas 删除列操作
2022/03/16 Python