当前位置: 首页 > news >正文

python多线程、进程

1、 并行和并发

(1)并发:一定周期内,多个任务来回切换执行,宏观上形成“该周期内有多个任务在同时进行”;但同一时间点,只有一个任务在执行。

举例:
你想在2小时内同时完成做饭、扫地、烧水。但家里就你一个人,你根据操作难易排了下顺序,所以就先把电茶壶接满水开始烧。接着你就做饭,做饭中,有个菜需要炖半个小时,这个时候你发现电茶壶的水还没烧开,所以你就赶快又去扫地。等地扫完了,你发现水烧开了且菜还在炖,你就把水倒进了暖瓶。倒完接着做饭。
这样,所有任务完成的最终时间 同时受多任务之间的协调快慢、任务各自的完成时间限制。比如本来单独执行任一个任务:做饭70分钟、扫地20分钟、烧水15分钟,但是并发中可能出现水烧好了,菜也炖好了。你为了不让菜炖的太烂,就选择先把菜盛起来(资源抢占,做饭抢到了资源,倒水就还得继续等待下一次资源四方),这样“水被导入暖瓶”的时间就被推后。

总体就是:一个主体在同一周期(2小时)内同时开启多个线程,每个线程做1个任务,但同一时间点只有一个线程(也即一个任务)在做。

(2)并行:同一时间点,多个任务同时进行。

举例:家里有多个人。还是想在2小时内同时完成做饭、扫地、烧水。你就说A你来扫地,B你来烧水,C你来做饭。这样A,B,C就并行执行任务了!
这样,所有任务完成的最终时间 由 任务做的最慢的那条线决定。也就是最终只需要70分钟!

总体就是:多个主体(A,B,C)各自领取线程(即工作服,领取了工作服相当于领取了对应的任务),在时间执行上互不影响,不需要等待一方释放资源(即不需要等别人把工作服用完再给他)。同一时间点多个任务在做!

2、Python异步和多线程并发区别

参考:https://www.python100.com/html/564PVUJ9OQ99.html

异步:
单线程下完成多个任务切换。

举例:
工人-cpu核,衣服-线程,做饭、扫地、烧水-任务。

  • 多线程并发模型中,每个线程可以看作是同一工人拥有的不同工作服,虽然在同一时间段内他可以换上不同的工作服进行做饭、扫地、烧水这些任务,但在任何特定的时间点,他只能执行一项任务。比如他在做饭的同时还要扫地,那他必须停下来,换上扫地的工作服,然后扫地。“换衣服”就是在做线程的上下文切换,会消耗一定的时间。
  • 异步I/O(或事件驱动)模型中,可以看做虽然这个工人他拥有多套工作服(多个线程),但是他的每套工作服都是万能的。比如他在做饭、扫地、烧水时只需穿其中一套万能工作服即可,不用再每次切换任务都要换工作服(即在单线程内同时完成多项任务,不用线程间切换),但他在任何特定的时间点也只能做一项任务。他可以在等待烧水的过程中去做饭或者扫地,这样虽然仍然是一项一项地完成任务,但由于减少了等待资源的时间,整体上可以在相同的时间内完成更多的任务。

但全局变量的安全性是受多线程影响的!在单个线程中使用异步IO,只会提高cpu的使用率(异步I/O可以有效地解决I/O密集型任务中的阻塞问题,提高程序的并发性能)。但无法保障整个web中只有这一个线程,所以异步IO并不能保证全局变量的安全性!

3、多线程和多进程

多线程适合“IO密集型任务(如请求网页、读写文件等)”
多进程适合“计算密集型任务(指CPU计算占主要的任务,CPU一直处于满负荷状态。比如在一个很大的列表中查找元素(当然这不合理)、复杂的加减乘除等。)”
多进程和多线程既可以并发运行也可并行运行。

python和java多线程比较

(1)python 多线程是假的。

因为GLC锁的存在,即使多线程下也只是让他们交替获得GLC锁,即每个线程都可以执行,但也只是“交替”执行,而不是真正的同时执行!同一时间下,即使是多CPU,也只有1个线程可以获得GLC锁,即只有一个线程可执行!

简明案例:
https://www.cnblogs.com/fulaien/p/16489366.html
https://www.rstk.cn/news/736629.html?action=onClick
https://zhuanlan.zhihu.com/p/24283040

python: 多线程共享进程的内存;多进程互相独立。但python下多进程并行是真的。

(2)java下,多线程并发可以实现并行。

如果是单个CPU,那效果和python多线程是一样的。如果是多个CPU,每个CPU上的线程互不影响,就会出现多线程下、同一时间点下、不同CPU上都有线程在跑,这样就真正实现了并发下的并行!

java: 每个线程有自己独立的栈和资源。

http://www.lryc.cn/news/169856.html

相关文章:

  • Vue基础之模板语法介绍
  • 【SLAM】 前端-视觉里程计之特征点
  • Android笔记(二十九):利用python自动生成多语言
  • 【C++STL基础入门】list的运算符重载和关于list的算法
  • 查找内轮廓(孔洞)
  • Git(6)——GitHub
  • 【RocketMQ专题】快速实战及集群架构原理详解
  • [设计模式] 浅谈SOLID设计原则
  • 基于Java+SpringBoot+Vue的旧物置换网站设计和实现
  • Java基本语法2
  • 【数据结构】树的存储结构;树的遍历;哈夫曼树;并查集
  • CSS选择器练习小游戏
  • Python运算符、函数与模块和程序控制结构
  • 微服务保护-Sentinel
  • Doris 导出表结构或数据
  • SELECT * from t_user where user_id = xxx,可以从那几个点去优化这句sql
  • 解决报错 java.lang.IllegalArgumentException: Cannot format given Object as a Date
  • 【Git】03-GitHub
  • Java手写最短路径算法和案例拓展
  • 深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战
  • 基于matlab实现的多普勒脉冲雷达回波仿真
  • Linux服务器中安装Anaconda+Tensorflow+Keras
  • ubuntu+.net6+docker 应用部署教程
  • Spring常见面试题总结
  • Git全套命令使用
  • 【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)
  • Vue3为什么推荐使用ref而不是reactive
  • JavaScript函数this指向
  • Java的序列化
  • 计算机二级python简单应用题刷题笔记(一)