一、什么是线程和进程

这个查了很多资料,最后我理解是这样的
进程:是 CPU 资源分配的最小单位,它主要用来就是资源的分配
线程:是 CPU 调度执行的最小单位,它主要用来系统调度

通俗的说我们电脑任务管理器中,运行的一个.exe文件,就是一个进程

image.png

启动一个进程,系统就要给他分配资源空间,比如说运行的内存神马滴,所以进程开多了,电脑就会卡,所以进程很耗系统资源
所以引出了线程,进程负责拿到资源分配,然后进程会起很多线程为他干活儿,比如微信,打开一个聊天是一个线程,打开两个聊天是启了两个线程,一个进程可以启很多个线程,这些线程共享一个进程的资源,所以线程更省资源,可以实现并发,但线程同样会受cpu调度

二、一般python多线程,我用到的场景

(1)想速度快的完成工作量比较大的工作,比如说爬去网页上的内容,内容比较多,我就会开启多线程去爬取
(2)在作一个任务的同时,还要同时做另一件事儿,两件事儿要并行,所以也会启动一个线程,像之前的文章,一方面在跑监控,一方面要有一个网页实时展示结果
mitmproxy_flask+layui+schedule+多线程实现监控数据实时展示_2021-11-06 - 简书

三、现在开始我们来看一下多线程

(1)之前我们单线程的时代,我们干活儿是顺序的

# -*-coding:utf-8-*-import timedef feed_dog(name):for i in range(0, 5):print("I am feeding dog %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(2)def feed_cat(name):for i in range(0, 5):print("I am feeding cat %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(5)if __name__ == "__main__":feed_dog("旺财")feed_cat("咪咪")print("主线程时间:%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

输出结果是:

I am feeding dog 旺财 .......2021-11-10 11:18:45
I am feeding dog 旺财 .......2021-11-10 11:18:47
I am feeding dog 旺财 .......2021-11-10 11:18:49
I am feeding dog 旺财 .......2021-11-10 11:18:51
I am feeding dog 旺财 .......2021-11-10 11:18:53
I am feeding cat 咪咪 .......2021-11-10 11:18:55
I am feeding cat 咪咪 .......2021-11-10 11:19:00
I am feeding cat 咪咪 .......2021-11-10 11:19:05
I am feeding cat 咪咪 .......2021-11-10 11:19:10
I am feeding cat 咪咪 .......2021-11-10 11:19:15
主线程时间:2021-11-10 11:19:20

这是一个招描逗狗的时代,如果单线程,程序只能顺序执行,先逗完狗,再去逗猫
时间总共花了35秒

(2)现在我能干了,我的效率变高了,我就要一边招猫一边逗狗,两样一起干
所以我们要启用多线程,两件事儿一起干

# -*-coding:utf-8-*-
import threading
import timedef feed_dog(name):for i in range(0, 5):print("I am feeding dog %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(2)def feed_cat(name):for i in range(0, 5):print("I am feeding cat %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(5)if __name__ == "__main__":t_dog = threading.Thread(target=feed_dog,args=("旺财",)) #创建线程 t_cat = threading.Thread(target=feed_cat, args=("咪咪",) ) #创建线程 threads = [t_cat,t_dog] #把多个线程放一个数组里for thread in  threads:thread.start()    #依次启动线程for thread in threads:thread.join() #用于等待线程终止print("主线程时间:%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

输出结果是

I am feeding cat 咪咪 .......2021-11-10 11:25:14
I am feeding dog 旺财 .......2021-11-10 11:25:14
I am feeding dog 旺财 .......2021-11-10 11:25:16
I am feeding dog 旺财 .......2021-11-10 11:25:18
I am feeding cat 咪咪 .......2021-11-10 11:25:19
I am feeding dog 旺财 .......2021-11-10 11:25:20
I am feeding dog 旺财 .......2021-11-10 11:25:22
I am feeding cat 咪咪 .......2021-11-10 11:25:24
I am feeding cat 咪咪 .......2021-11-10 11:25:29
I am feeding cat 咪咪 .......2021-11-10 11:25:34
主线程时间:2021-11-10 11:25:39

我启动了两个线程,同时做两件事情,我的时间节省了10秒,用了25秒的时间
首先启动多线程要引入threading

import threading

join函数是等待线程中止,说白了就是启动的线程的事儿干完了,再干主线程的活儿,我理解主线程就是main函数中,除了thread启动的以外的线程,比如说上面的
print("主线程时间:%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

 for thread in threads:thread.join()

所以上面的线程都执行完了,再执行了输出主线程时间的语句

那其实一些场景,我们不需要前面有对主线程的阻塞,我们需要主线程和启动的线程一起干活儿,但是主线程结束了,其他启动的线程也要跟着结束,所以我们要用到一个方法,这个方法一定要写在start()前面,他会把启动的线程设为主线程的守护线程,守护线程启动后,就去干他的活儿了,代码会接着往后跑,不会阻塞主线程

t.setDaemon(True)

我们再来改一下代码

import threading
import timedef feed_dog(name):for i in range(0, 5):print("I am feeding dog %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(2)def feed_cat(name):for i in range(0, 5):print("I am feeding cat %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(5)if __name__ == "__main__":t_dog = threading.Thread(target=feed_dog,args=("旺财",))t_cat = threading.Thread(target=feed_cat, args=("咪咪",) )threads = [t_cat,t_dog]for thread in  threads:thread.setDaemon(True)thread.start()print("主线程时间:%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

输出结果是:

I am feeding cat 咪咪 .......2021-11-10 12:06:00
I am feeding dog 旺财 .......2021-11-10 12:06:00
主线程时间:2021-11-10 12:06:00

从结果可以看出,t_dog , t_cat启动后,并没有阻塞主线程,因为主线程只输出一句话,所以很快就运行完了,主线程结束后,守护线程也就没有接着往下运行,同时也就结束了

同理,之前写的
mitmproxy_flask+layui+schedule+多线程实现监控数据实时展示_2021-11-06 - 简书
监控的同时,显示结果的网页也在同时刷新结果,但是我监控一旦停止了,你的结果网页显示也就没意义了,所以也要停止,用的就是这种方式

我们再把代码改的明显点:

# -*-coding:utf-8-*-
import threading
import timedef feed_dog(name):for i in range(0, 5):print("I am feeding dog %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(2)def feed_cat(name):for i in range(0, 5):print("I am feeding cat %s .......%s" % (name,time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))time.sleep(5)if __name__ == "__main__":t_dog = threading.Thread(target=feed_dog,args=("旺财",))t_cat = threading.Thread(target=feed_cat, args=("咪咪",) )threads = [t_cat,t_dog]for thread in  threads:thread.setDaemon(True)thread.start()for i in range(0,5):time.sleep(1)print("主线程时间:%s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

输出结果

I am feeding cat 咪咪 .......2021-11-10 12:10:42
I am feeding dog 旺财 .......2021-11-10 12:10:42
主线程时间:2021-11-10 12:10:43
I am feeding dog 旺财 .......2021-11-10 12:10:44
主线程时间:2021-11-10 12:10:44
主线程时间:2021-11-10 12:10:45
I am feeding dog 旺财 .......2021-11-10 12:10:46
主线程时间:2021-11-10 12:10:46
I am feeding cat 咪咪 .......2021-11-10 12:10:47
主线程时间:2021-11-10 12:10:47Process finished with exit code 0

这个很是显了吧,守护线程没有阻塞主线程,两个线程一起在做各自的事情,但主线程一旦结束,子线程不管做没做完,都会跟着结束

python_浅谈python多线程相关推荐

  1. 浅谈Python多线程

    线程 一.什么是线程? 操作系统原理相关的书,基本都会提到一句很经典的话: "进程是资源分配的最小单位,线程则是CPU调度的最小单位". 线程是操作系统能够进行运算调度的最小单位. ...

  2. 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题

    我们复制PDF到Google翻译时,总是会出现换行的情况,如果自己手动去除,那就太麻烦了. 那么用Python就可以解决,复制到粘贴板以后,Python程序自动可以把\n换成空格,然后我们就可以复制到 ...

  3. 浅谈python_浅谈Python(二)

    一.Python算术运算符 以下假设变量a为10,变量b为21: 运算符描述实例 + 加 -- 两个对象相加 a + b 输出结果 31 - 减 -- 得到负数或是一个数减去另一个数 a - b 输出 ...

  4. js打印线程id_浅谈python中的多线程和多进程(二)

    原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...

  5. 获得进程id_浅谈python中的多线程和多进程(二)

    原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...

  6. python中gil锁和线程锁_浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的 ...

  7. python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题

    浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...

  8. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  9. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

最新文章

  1. 体验首款Linux消费级平板,原来芯片和系统全是国产
  2. mybatis框架--学习笔记(下)
  3. 直方图均衡化为何需要累积概率的通俗解释,保证让你秒懂
  4. 科普 | 5G基站功耗,到底有多可怕?
  5. matlab火箭升空问题,困扰火箭的三大问题终于要解决了!球迷:我都要膨胀了!...
  6. 如何通过 C# 实现对象的变更跟踪 ?
  7. Android平台RTMP/RTSP播放器开发系列之解码和绘制
  8. 【操作系统】Semaphore处理吸烟者问题
  9. Java讲课笔记22:Set接口及其实现类
  10. opencv-api pyrDown
  11. A股开盘:深证区块链50指数跌0.20%,136只概念股下跌
  12. C Tricks(十五)—— 算符优先级的表示
  13. java虚拟机之垃圾回收器
  14. linux6.8屏幕黑屏,centos6.8笔记本关盖就黑屏怎样设置不黑屏?
  15. 使用VS2015编译OpenJDK8
  16. JavaScript下载本地文件
  17. android关机铃声代码,android系统添加关机铃声
  18. hoolilaw解读:在美国如何应对交通罚单
  19. python爬取微信小程序源代码_【实战】CrawlSpider实现微信小程序社区爬虫
  20. 博弈论学习(二)——完全信息静态博弈

热门文章

  1. SIFT特征提取分析(转载)
  2. 微信小程序组件传值接收不到id
  3. 小米MIX 3获得ROOT权限的步骤
  4. vue阻止穿透滚动穿透
  5. 数据中心网络运维一指禅
  6. 【每日亿题】2021icpc江西省赛
  7. win2016开启smb服务器_使用Hyper-v Server 2016构建免费的SMB3服务器
  8. 计算机毕设选题推荐之智慧考试系统 在线批卷阅卷系统 随机组卷系统 考试题库系统 springboot考试系统 作业管理系统 在线作业批改系统(源代码+文档+调试+讲解)
  9. mysql 树排序_从MySQL开始聊聊“树”结构 (上)
  10. 24V转3.3V芯片,同步降压调节器