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下的常用下载安装工具pip的安装方法
Nov 13 Python
详解Python中的变量及其命名和打印
Mar 11 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
Python中的单行、多行、中文注释方法
Jul 19 Python
python代码过长的换行方法
Jul 19 Python
python多进程读图提取特征存npy
May 21 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
python异步编程 使用yield from过程解析
Sep 25 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
Python学习之os模块及用法
Jun 03 Python
pandas针对excel处理的实现
Jan 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
PHP 中文处理技巧
2010/04/25 PHP
php创建sprite
2014/02/11 PHP
php页面缓存方法小结
2015/01/10 PHP
laravel自定义分页效果
2017/07/23 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
python将unicode转为str的方法
2017/06/21 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python和opencv实现抠图
2018/07/18 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
python学习开发mock接口
2019/04/28 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
如何通过python实现人脸识别验证
2020/01/17 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
c/c++某大公司的两道笔试题
2014/02/02 面试题
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
毕业生自我鉴定
2013/12/04 职场文书
学校安全检查制度
2014/01/27 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
销售经理岗位职责
2014/03/16 职场文书
高一军训口号
2015/12/25 职场文书
解除租赁合同协议书
2016/03/21 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python