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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
Python导入txt数据到mysql的方法
Apr 08 Python
python 生成器协程运算实例
Sep 04 Python
python和ruby,我选谁?
Sep 13 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
python 常见字符串与函数的用法详解
Nov 23 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
Python最小二乘法矩阵
Jan 02 Python
Python验证码截取识别代码实例
May 16 Python
一些让Python代码简洁的实用技巧总结
Aug 23 Python
Python实现双向链表基本操作
May 25 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的常用配置选项汇总
2016/03/24 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
js切换div css注意的细节
2012/12/10 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
js实现for循环跳过undefined值示例
2019/07/02 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
Python实时获取cmd的输出
2015/12/13 Python
Android分包MultiDex策略详解
2017/10/30 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
Python学习小技巧总结
2018/06/10 Python
python 多线程串行和并行的实例
2019/02/22 Python
django实现日志按日期分割
2020/05/21 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
好军嫂事迹材料
2014/01/15 职场文书
计算机个人求职信范例
2014/01/24 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
清洁员岗位职责
2015/02/15 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
同学会演讲稿
2019/04/02 职场文书
详解Vue的options
2021/05/15 Vue.js
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
Go语言grpc和protobuf
2022/04/13 Golang
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby