有编程经验或经历的同学都知道,很多时候我们在实现程序的时候首先考虑的都是代码的逻辑性,毕竟首先要要求我们的代码能够正确运行,其次就是在满足要求的基础之上要有性能需求。例如在python的火热运用点爬虫上,如果爬虫脚本写完了,但这个网站的数据量又非常大,在较好的网络环境基础下,通常一个网页的http请求我们就假设为1S,如果几个网站有上亿或者几十亿的数据量需要爬取下载,那岂不是要几十亿秒,就算是按照一亿秒计算下来也是好几年,你说这样的程序你会要么,很显然不会,那这个时候我们就可以使用python的并发编程中的多线程来实现,简单的说就是一个人干活儿太慢了,那我们就多招人,招到完工时期能够满足我们效率需求的人数。

以上其实就是对我们今天要将的python多线程的基本解释,当然我们也可以用其他方式来实现。什么是线程?在介绍线程之前先简单提一下进程,大家目前只需要理解的就是在电脑系统里面,我们所运行的一个应用程序就可以理解成为一个进程。而线程就是进程的组成部分,一个进程可以拥有多个线程。在多线程中,会有一个主线程来完成整个进程从开始到结束的全部操作,而其他的线程会在主线程的运行过程中被创建或退出。

当一个进程里只有一个线程时,叫作单线程。超过一个线程就叫作多线程。通俗的理解:进程和线程的关系就是操作系统可以同时执行多个任务,每一个任务就是一个进程,进程可以同时执行多个任务,每一个任务就是一个线程。那么我们应该怎么实现python的多线程?

python 中,有关线程开发的部分被单独封装到了模块中,和线程相关的模块有以下 2 个:

  • _thread:是 Python 3 以前版本中 thread 模块的重命名,此模块仅提供了低级别的、原始的线程支持,以及一个简单的锁。功能比较有限。正如它的名字所暗示的(以 _ 开头),一般不建议使用 thread 模块;
  • threading:Python 3 之后的线程模块,提供了功能丰富的多线程支持,推荐使用。

本节就以 threading 模块为例进行讲解。Python 主要通过两种方式来创建线程:

  1. 使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
  2. 继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。

1、调用Thread类的构造器创建线程

Thread 类提供了如下的 __init__() 构造器,可以用来创建线程:

__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)

此构造方法中,以上所有参数都是可选参数,即可以使用,也可以忽略。其中各个参数的含义如下:

  • group:指定所创建的线程隶属于哪个线程组(此参数尚未实现,无需调用);
  • target:指定所创建的线程要调度的目标方法(最常用);
  • args:以元组的方式,为 target 指定的方法传递参数;
  • kwargs:以字典的方式,为 target 指定的方法传递参数;
  • daemon:指定所创建的线程是否为后代线程。

这些参数,初学者只需记住 target、args、kwargs 这 3 个参数的功能即可。

下面程序演示了如何使用 Thread 类的构造方法创建一个线程:

import 

由此就创建好了一个线程。但是线程需要手动启动才能运行,threading 模块提供了 start() 方法用来启动线程。因此在上面程序的基础上,添加如下语句: thread.start()

再次执行程序,其输出结果为:

Thread-1 http://c.biancheng.net/python/
Thread-1 http://c.biancheng.net/shell/
Thread-1 http://c.biancheng.net/java/

可以看到,新创建的 thread 线程(线程名为 Thread-1)执行了 action() 函数。

默认情况下,主线程的名字为 MainThread,用户启动的多个线程的名字依次为 Thread-1、Thread-2、Thread-3、...、Thread-n 等。

为了使 thread 线程的作用更加明显,可以继续在上面程序的基础上添加如下代码,让主线程和新创建线程同时工作:

for i in range(5):print(threading.current_thread().getName())

再次执行程序,其输出结果为:

MainThreadThread-1 http://c.biancheng.net/python/
MainThreadThread-1 http://c.biancheng.net/shell/
MainThreadThread-1 http://c.biancheng.net/java/
MainThread
MainThread

可以看到,当前程序中有 2 个线程,分别为主线程 MainThread 和子线程 Thread-1,它们以并发方式执行,即 Thread-1 执行一段时间,然后 MainThread 执行一段时间。通过轮流获得 CPU 执行一段时间的方式,程序的执行在多个线程之间切换,从而给用户一种错觉,即多个线程似乎同时在执行。

如果程序中不显式创建任何线程,则所有程序的执行,都将由主线程 MainThread 完成,程序就只能按照顺序依次执行。

2、继承Thread类创建线程类

通过继承 Thread 类,我们可以自定义一个线程类,从而实例化该类对象,获得子线程。需要注意的是,在创建 Thread 类的子类时,必须重写从父类继承得到的 run() 方法。因为该方法即为要创建的子线程执行的方法,其功能如同第一种创建方法中的 action() 自定义函数。下面程序,演示了如何通过继承 Thread 类创建并启动一个线程:

import threading#创建子线程类,继承自 Thread 类
class my_Thread(threading.Thread):def __init__(self,add):threading.Thread.__init__(self)self.add = add# 重写run()方法def run(self):for arc in self.add:#调用 getName() 方法获取当前执行该程序的线程名print(threading.current_thread().getName() +" "+ arc)#定义为 run() 方法传入的参数
my_tuple = ("http://c.biancheng.net/python/","http://c.biancheng.net/shell/","http://c.biancheng.net/java/")
#创建子线程
mythread = my_Thread(my_tuple)
#启动子线程
mythread.start()
#主线程执行此循环
for i in range(5):print(threading.current_thread().getName())

执行结果:

MainThreadThread-1 http://c.biancheng.net/python/

MainThreadThread-1 http://c.biancheng.net/shell/

MainThreadThread-1 http://c.biancheng.net/java/

MainThread

MainThread

c++ 多线程_python要点-多线程相关推荐

  1. python什么是多线程_python中多线程指的是什么

    python中多线程指的是什么 发布时间:2020-09-03 10:59:59 来源:亿速云 阅读:73 作者:小新 这篇文章主要介绍python中多线程指的是什么,文中介绍的非常详细,具有一定的参 ...

  2. 面向 CPython GIL 的多线程编程要点

    目录 文章目录 目录 Python GIL Python GIL 对线程并发性能的影响 保留 GIL 的历史原因 为了兼顾解释型语言的简单 为了兼顾 C 程序库的安全 Python 的多线程编程要点 ...

  3. python如何开启多线程_Python如何创建多线程

    Python提供了_thread和threading两个模块来支持多线程,但_thread提供低级别的.原始的县城支持,以及一个简单的锁,通常情况下我们使用后者,来进行多线程编程 创建多线程 使用th ...

  4. python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解

    Python基于多线程操作数据库相关问题分析 本文实例分析了Python多线程操作数据库相关问题.分享给大家供大家参考,具体如下: python多线程并发操作数据库,会存在链接数据库超时.数据库连接丢 ...

  5. 关于python的多线程和多进程_Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  6. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  7. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  8. 多线程编程 java_java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般 ...

  9. iOS多线程编程之多线程简单介绍(转载)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过& ...

  10. Python之多线程:python多线程设计之同时执行多个函数命令详细攻略

    Python之多线程:python多线程设计之同时执行多个函数命令详细攻略 目录 实现功能 采取方法 应用场景 实现功能 同时执行多个函数命令 采取方法 T1.单个实现 import threadin ...

最新文章

  1. 怎样在PHP中通过ADO调用Asscess数据库和COM程序
  2. 联想 android 5.1 root权限,联想A520手机ROOT权限图文教程(附联想A520root工具)
  3. C#属性的声明和使用演示源码片段
  4. centos7.5 安装配置supervisor管理python进程(也就是服务)
  5. MATLAB常用正则表达式记录
  6. Vue学习--黑马电商管理系统
  7. 为什么苹果日历不能设置日程_苹果自带日历hold每日待办日程提醒不再轻易miss日程...
  8. Uniapp 添加Iconfont
  9. 7-6 计算存款利息
  10. 汉明码纠错java_汉明码(Hamming)编码与纠错原理
  11. 混迹职场N年后,人过中年,如何不被社会所淘汰?
  12. python计算多边形面积
  13. Compose Multiplatform 实战:联机五子棋
  14. Oracle 查询基础练习题 -hr
  15. vis Network demo,源码开源 + (vue框架)
  16. linux 分区 dev,linux-kernel – 是/ dev / dm-1分区还是整个块设备?
  17. 关于basler相机传输速度过慢/传输丢帧
  18. ④ESP8266 开发学习笔记_By_GYC 【Ubuntu系统下ESP8266 开发环境搭建】
  19. Html和CSS入门(笔记)—HTML
  20. 树与图的深度优先遍历模版原理

热门文章

  1. C#基础-获得当前程序的 空间名.类名.方法名
  2. viewpager 获取当前现实的view
  3. MySQL学习笔记:一道group by+group_concat解决的小问题
  4. 使用ServletContextListener关闭Redisson连接
  5. Matlab高级教程_第一篇:Matlab基础知识提炼_02
  6. Unity3d 调用C++写的DLL
  7. 十大著名黑客——斯蒂芬-沃兹尼克
  8. 计算机视觉(CV)前沿国际国内期刊与会议
  9. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他。
  10. mathematica打包java_使用Mathematica将解决方案绘制到方程式中