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中kmeans聚类实现代码
Feb 23 Python
Django处理文件上传File Uploads的实例
May 28 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
Python读取yaml文件的详细教程
Jul 21 Python
Django数据库迁移常见使用方法
Nov 12 Python
python绘图pyecharts+pandas的使用详解
Dec 13 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网站地图生成类示例
2014/01/13 PHP
php中print(),print_r(),echo()的区别详解
2014/12/01 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP实现百度人脸识别
2019/05/06 PHP
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python+pygame实现坦克大战
2019/09/10 Python
Python学习之os模块及用法
2020/06/03 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
蒂娜商店:Tiina the Store
2019/12/07 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
大学生党员自我批评
2014/02/14 职场文书
个人安全承诺书
2014/05/22 职场文书
永不妥协观后感
2015/06/10 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Golang bufio详细讲解
2022/04/21 Golang
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang