1.线程的概念

  • 线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要CPU进行调度,也就是说线程是CPU调度的基本单位每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
  • 线程是一个独立的执行流,系统中的多个线程可以并行及并发执行,多个线程可以共享数据与资源、利用了所谓的共享信息空间。
  • 一个线程主要由3个元素构成: 程序计数器、寄存器、与栈

2.Python中多线程  ----  threading模块

  1.导入线程模块

import threading

   2.线程类Thread参数说明
    Thread(group,target,name,args,kwargs)

  • gourp:线程组,目前只能使用None
  • target:执行的目标任务名
  • args:以元组的方式给执行任务传参
  • kwargs:以字典方式给执行任务传参
  • name:线程名,一般不用设置

3.多线程的注意点

  • 当调用Thread的时候,不会创建线程
  • 调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及让这个线程开始运行线程真正创建是调用start(),线程真正结束是主线程结束
  • 主线程会等待所有的子线程结束后才结束
  • 线程创建后谁先执行是不确定的,要确定先后的顺序可以通过延时的方式来保证只要主线程一死,其他的子线程就会全部结束

3.多线程的使用

下面看例子:

  • 首先看看不使用多线程,使用单线程所花费的时间
import timedef eat_fish():print("--正在吃鱼--")time.sleep(1)if __name__ == '__main__':for i in range(5):eat_fish()'''
运行的结果,  一次只执行一次,5秒钟执行完成
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
'''
  •  用threading创建多线程来执行任务

t =  threading.Thread(target=函数名)   # 生成一个子线程对象

t.start()                                                  #  然后利用这个对象调用start()方法,,来创建一个子线程

详解:

   threading.Thread(

      group=None,name=None,args=(),kwargs={}

)

# 导入线程模块
import threading
import timedef eat_candy():print("--正在吃糖果--")time.sleep(1)if __name__ == '__main__':for i in range(5):t = threading.Thread(target=eat_candy)  # 给target传入函数的名字# 生成一个实例对象 t t.start()   # 启动线程,即让线程开始执行'''
运行的结果,  一次就执行完成,花费1秒执行完成   5个线程
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
--正在吃糖果--
'''

4.获取线程(查看线程的名称)

threading.current_thread()

5.查看线程数

  threading.enumerate()   #  返回值是一个列表,里面有当前执行的所有线程
  • 循环查看当前运行的线程
import threading
import timedef test1():for i in range(3):print("----test1---%d---"%i)time.sleep(1)'''如果创建Thread时执行的函数,运行结束那么意味着 这个子线程就结束了'''def test2():for i in range(6):print("----test2---%d---"%i)time.sleep(1)def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()t2.start()while True:print(threading.enumerate())  # 打印出线程的列表'''所有的线程只剩一个的时候(即主线程)就退出'''if len(threading.enumerate())<=1:breaktime.sleep(1)
if __name__ == '__main__':main()

Thread执行的函数结束时,线程就结束了,所以打印线程的长度是就会少一个。

  • 在使用Thread时,线程是从什么时候开始创建的,什么时候结束
import threading
import timedef test1():for i in range(5):print("----test1---%d---" % i)time.sleep(1)def main():# 在调用Thread之前先打印当前线程信息print(threading.enumerate())t1 = threading.Thread(target=test1)# 在调用Thread之后打印print(threading.enumerate())t1.start()# 在调用start()之后打印print(threading.enumerate())if __name__ == '__main__':main()

结果:

6. 通过继承Thread类完成创建线程

  1. 适合一个线程里面做的事情比较复杂,而且分了多个函数来做,一般来封装成一个类,类里面覆写run()方法用这个类的实例对象来调用start()方法
  2. 如果类里面还有其他的方法想要用子线程,直接在run()方法里面调用就行(例如:self.login()) 如果直接用实例.方法名时,不会创建子线程
import threading
import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm"+self.name+"@"+str(i) # name 属性中保存的是当前线程的名字print(msg)def login(self):pass'''如果类里面还有其他的方法想要用子线程,直接在run()方法里面调用就行(例如:self.login())如果直接用实例.方法名时,不会创建子线程,'''if __name__ == '__main__':t = MyThread()t.start()    # 直接利用类的实例对象调用start()方法

运行结果:

I'mThread-1@0
I'mThread-1@1
I'mThread-1@2

Python多任务(2.线程的概念以及组成(创建线程的两种方式))相关推荐

  1. python爬虫 破解js加密有道词典案列的两种方式以及思路总结

    代码在后面 思路1总结 抓包找到这四个加密参数 'salt': salt, 'sign': sign, 'ts': ts, 'bv': bv, 得到四个值(涉及到js中 MD5, 时间戳. 随机数等) ...

  2. Python创建进程、线程的两种方式

    代码创建进程和线程的两种方式 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. ...

  3. python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例

    本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式.分享给大家供大家参考,具体如下: GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程 ...

  4. Python 35 线程(1)线程理论、开启线程的两种方式

    一:线程理论 1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程 2 为何要用线程    线程vs进程      1. 同一进程下的多个线程共享 ...

  5. python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  6. python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  7. Python创建进程的四种方式

    Python创建进程的四种方式 百度百科 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构 ...

  8. Python day 34 并发编程、PID/PPID、实现多进程得两种方式

    ## 进程及并发的产生 ```python 进程指的是正在运行的程序,是一系列过程的统称,也是操作系统在调度和进行资源分配的基本单位 并发,指的是多个任务同时被执行,并发编程指的是编写支持多任务并发的 ...

  9. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                      优点:输入一行代码立刻返回结果                       缺点:无法永久保存代码 方法 ...

最新文章

  1. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
  2. android 布局preview 技巧
  3. linux insmod命令参数及用法详解--linux加载模块命令
  4. Java-string字符串
  5. PyTorch机器学习从入门到实战
  6. python 数据结构 树 dev get items_python数据结构之树(二叉树的遍历)
  7. Docker基本概念与实践(四)-部署简单web项目(tomcat+war+mysql)
  8. router优点 vue_Vue 出场率99%的面试题
  9. python动态变量名_python实现可变变量名方法详解
  10. FM1288的AEC调试经历,持续更新
  11. pwdx 查看进程启动时的工作目录
  12. VS2010旗舰版安装图解
  13. linux 笔记本摄像头,Ubuntu 7.10 下屏蔽笔记本摄像头的方法
  14. SQLite3使用详解之二
  15. 黑天鹅mobi_破坏我们系统的因素:黑天鹅分类法
  16. Django学习路线之Django自带模板语言DTL
  17. 全球首个身份验证保险 提供每笔交易100万美金保额
  18. Weird Rounding
  19. 2020“黄鹤杯”网络安全人才与创新峰会圆满成功
  20. fastdfs+nginx+keepalived+openoffice+lua 实现文件上传、下载、水印、预览(word、excel、ppt、txt),feign文件上传

热门文章

  1. mysql 一次性导入数据库_Mysql 一次性备份导出/导入恢复所有数据库
  2. recycleview 嵌套高度问题_RecyclerView嵌套子RecyclerView无法正常显
  3. spring boot报错Invalid numeric value: Leading zeroes not allowed
  4. Codeforces 1196A Three Piles of Candies
  5. Just a Simple Problem
  6. linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本
  7. java intern_java String的intern方法
  8. 操作系统 第四章【存储器管理】【MOOC答案】
  9. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
  10. 2021数模美赛论文提交具体规则和注意事项汇总!