首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 多进程与多线程

前言:为什么有人说 Python 多线程是鸡肋,不是真正意义多线程? 看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。 问题: 1、Python 多线程为什么耗时更长?...2、为什么 Python 里面推荐使用多进程而不是多线程? 1 基础知识 现在 PC 都是多核,使用多线程能充分利用 CPU 来提供程序执行效率。...并且由于 GIL 锁存在,Python 里一个进程永远只能同时执行一个线程(拿到 GIL 线程才能执行),这就是为什么多核CPU,Python 多线程效率并不高根本原因。...如果两个进程试图同一时间同一端进行读取和写入那么,这可能会损坏管道中数据。 具体用法如下: ? 3.3 进程池 创建多个进程,我们不用傻傻地一个个去创建。我们可以使用Pool模块来搞定。...CPU 密集型:程序比较偏重于计算需要经常使用 CPU 来运算。例如科学计算程序,机器学习程序等。 I/O 密集型:顾名思义就是程序需要频繁进行输入输出操作。

1.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

【38期】JAVA中线程池设置多少合适?

理论基础 一个 CPU 核心,某一时刻只能执行一个线程指令 一个极端线程(不停执行 “计算” 型操作时),就可以把单个核心利用率跑满,多核CPU 最多只能同时执行等于核心数 “极端” 线程数...CPU 利用率,同时执行更多线程 I/O 事件频率频率越高,或者等待 / 暂停时间越长,CPU 空闲时间也就更长,利用率越低,操作系统可以调度 CPU 执行更多线程 测试验证 基于上面的理论基础...I/O 事件频率频率越高,或者等待 / 暂停时间越长,CPU 空闲时间也就更长,利用率越低,操作系统可以调度 CPU 执行更多线程 线程数规划公式 前面的铺垫,都是为了帮助理解,现在来看看书本定义...《Java 并发编程实战》介绍了一个线程数计算公式: 如果希望程序跑到 CPU 目标利用率,需要线程数公式为: 公式很清晰,现在来带入上面的例子试试看:如果我期望目标利用率为 90%(多核 90...流程一般是这样: 分析当前主机上,有没有其他进程干扰 分析当前 JVM 进程,有没有其他运行中或可能运行线程 设定目标 目标 CPU 利用率 - 我最高能容忍我 CPU 飙到多少?

1.3K20

java面试强基(22)

为什么要使用多线程呢?  先从总体上来说: 从计算机底层来说: 线程可以比作是轻量级进程,是程序执行最小单位,线程间切换和调度成本远远小于进程。...再深入到计算机底层来探讨: 单核时代: 单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统效率。...从而提高了 Java 进程利用系统资源整体效率。 多核时代: 多核时代多线程主要是为了提高进程利用多核 CPU 能力。...而创建多个线程,这些线程可以被映射到底层多个 CPU 执行,在任务中多个线程没有资源竞争情况下,任务执行效率会有显著性提高,约等于(单核时执行时间/CPU 核心数)。...进入等待状态线程需要依靠其他线程通知才能够返回到运行状态,而 TIMED_WAITING(超时等待) 状态相当于等待状态基础增加了超时限制,比如通过 sleep(long millis)方法或

15610

浅谈:Golang 并发

进程与线程 概念 面向进程设计系统中,进程(process)是程序基本执行实体;在当代面向线程设计计算机结构中,进程是线程容器。 进程是程序(指令和数据)真正运行实例。...就绪态:这代表线程想要一个 CPU 核来执行被分配机器指令。如果你有很多个线程需要 CPU,那么线程就不得不等待更长时间。此时,因为许多线程都在争用 CPU,每个线程得到运行时间也就缩短了。...它一直都需要使用 CPU,因此线程切换并没有用,甚至会产生负面效果,主要通过多核并行来解决问题。这种工作通常都是数学计算。比如计算圆周率第 n 位工作就属于 CPU密集型工作。...线程上下文切换时间一般是50~100ns,这是为什么如果对于计算密集型任务频繁切换反而会导致效果更差。...但是,对于多核系统来说,多线程每个核都有一份它自己所需要数据拷贝,随着 CPU运行线程改变,不同线程需要访问数据不同,从而导致同一个 cache line 中数据被修改了,其他所有核

72310

都是事件驱动,为什么Nginx性能远高于Redis?

为了让进程占用CPU全部计算力,Nginx充分利用了分时操作系统特点,比如增加CPU时间片、提高CPU二级缓存命中率、用异步IO和线程池方式回避磁盘阻塞读操作等等,只有清楚了Nginx这些招数...其中,动态优先级由内核根据进程类型自动决定,比如CPU进程就能比IO型进程获得更长时间片,而静态优先级可以通过setpriority函数设置。...CPU缓存由于离计算单元更近,而且使用了更快存储介质,所以二级缓存访问速度不超过10纳秒,相对应,主存存取速度至少60纳秒以上,因此频繁命中CPU缓存,可以提升Nginx指令执行速度。...这要从Linux文件系统非阻塞调用说起。 Worker进程含有数万个并发连接,处理连接过程中会产生大量上下文切换。...为了榨干多核CPU价值,Nginx无所不用其极:通过绑定CPU提升二级缓存命中率,通过静态优先级扩大时间片,通过多种手段均衡Worker进程之间负载,独立线程池中隔离阻塞IO操作,等等。

1.3K21

都是事件驱动,为什么Nginx性能远高于Redis?

为了让进程占用CPU全部计算力,Nginx充分利用了分时操作系统特点,比如增加CPU时间片、提高CPU二级缓存命中率、用异步IO和线程池方式回避磁盘阻塞读操作等等,只有清楚了Nginx这些招数...其中,动态优先级由内核根据进程类型自动决定,比如CPU进程就能比IO型进程获得更长时间片,而静态优先级可以通过setpriority函数设置。...CPU缓存由于离计算单元更近,而且使用了更快存储介质,所以二级缓存访问速度不超过10纳秒,相对应,主存存取速度至少60纳秒以上,因此频繁命中CPU缓存,可以提升Nginx指令执行速度。...这要从Linux文件系统非阻塞调用说起。 Worker进程含有数万个并发连接,处理连接过程中会产生大量上下文切换。...为了榨干多核CPU价值,Nginx无所不用其极:通过绑定CPU提升二级缓存命中率,通过静态优先级扩大时间片,通过多种手段均衡Worker进程之间负载,独立线程池中隔离阻塞IO操作,等等。

2.4K21

CPU 核数与线程数有什么关系?

炒菜与线程 实际CPU和厨师一样,都是按照菜谱(机器指令)去执行某个动作,从操作系统角度讲当CPU切换回用户态后,CPU执行一段指令就是线程,或者说属于某个线程。...很好,那我操作系统就通过修改你PC寄存器,让你CPU执行A任务机器指令一段时间,然后下一段时间再去执行B任务机器指令,再然后下一个时间段去执行C任务机器指令,由于每一段时间非常少,通常在毫秒级别...单核与多线程 假设现在有两个任务,任务A和任务B,每个任务需要计算时间都是5分钟,那么无论是任务A和任务B串行执行还是放到两个线程中并行执行,单核环境下执行完这两个任务总需要10分钟,因此有的同学觉得单核下多线程没什么用...多核时代 实际,线程这个概念是从2003年左右才开始流行为什么?因为这一时期,多核时代到来了。 之所以产生多核,是因为单核性能提升越来越困难了。...但通常来说,线程都需要一定I/O,可能需要一定同步互斥,那么这时适当增加线程可能会提高性能,但当线程数量到达一个临界值后性能开始下降,这时线程间切换开销将显著增加

6.6K40

CPU这么忙,休息一会不调度了

狼多肉少轮流吃 首先,为什么要调度,多任务OS中,每个任务都需要使用CPU需要为各个任务对CPU使用提供一种机制,这就是调度。调度器决定了某一个时刻,应该让哪个任务获得CPU使用权。...单队列情况下,当有一个新任务需要执行时,选择一个空闲CPU来执行,这样任务一会儿在这个CPU运行,一会儿又在那个CPU运行,没到一个CPU,cache往往都是“冷”,效率极低,所以就有了每个...假设有4个所需耗费时间都差不多任务,分给2个CPU来执行那好分配。如果这4个任务所需耗费时间差异很大,或者只有3个任务需要执行呢,该怎么分配?这就涉及到了多核系统负载均衡。...多核系统负载均衡 要实现多核系统负载均衡,主要依靠task不同CPU之间迁移(migration),也就是将一个task从负载较重CPU转移到负载相对较轻CPU上去执行。...Linux调度器支持自然CPU亲和性(natural CPU affinity)::调度器会试图保持进程相同CPU运行, 这意味着进程通常不会在处理器之间频繁迁移。

85020

CPU 核数与线程数有什么关系?

炒菜与线程 实际CPU和厨师一样,都是按照菜谱(机器指令)去执行某个动作,从操作系统角度讲当CPU切换回用户态后,CPU执行一段指令就是线程,或者说属于某个线程。...很好,那我操作系统就通过修改你PC寄存器,让你CPU执行A任务机器指令一段时间,然后下一段时间再去执行B任务机器指令,再然后下一个时间段去执行C任务机器指令,由于每一段时间非常少,通常在毫秒级别...单核与多线程 假设现在有两个任务,任务A和任务B,每个任务需要计算时间都是5分钟,那么无论是任务A和任务B串行执行还是放到两个线程中并行执行,单核环境下执行完这两个任务总需要10分钟,因此有的同学觉得单核下多线程没什么用...在这种简单场景下,你创建线程时也不需要关心系统中是单核还是多核多核时代 实际,线程这个概念是从2003年左右才开始流行为什么?因为这一时期,多核时代到来了。...但通常来说,线程都需要一定I/O,可能需要一定同步互斥,那么这时适当增加线程可能会提高性能,但当线程数量到达一个临界值后性能开始下降,这时线程间切换开销将显著增加

2.3K50

多线程-概述及底层实现机制浅析

CPU对线程响应并不是连续,通常会在一段时间后自动中断线程。未响应线程增加,就会不断加大CPU占用。...多线程出现也是多核CPU、多处理器计算机普及需要,这样可以提高CPU利用率,增加并发性,提高程序执行效率,更快处理完任务。...如果进程时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。宏观:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。...实际,只有多处理器系统才是真正可得到处理器同时运行多个线程。 从一个进程切换到另一个进程需要一定时间--保存和装入寄存器值及内存映像,更新各种表格和队列等。...CPU时间20%被浪费了管理开销时间片设得太短会导致过多进程切换,降低了CPU效率;而设得太长又可能引起对短交互请求响应变差。

1.1K10

能感知功耗Linux调度器(EAS)

我们如何让这些机器硬件(即多核CPU)使用多核软件算法?您可能以前我们论坛听说过功耗感知调度(EAS)。这是Google Pixel智能手机表现如此出色部分原因。...解释之前,我们需要讨论Linux调度器。 Linux调度器演变 轮转调度 ? 轮转(round robin)是一个容易解释也容易理解概念,而且也不难理解其缺点。轮转使用时间片为每个进程分配时间。...假设我们计算机上正在运行四个进程进程A 进程B 进程C 进程D 现在,让我们描述轮转调度器工作。继续进行下一步之前,我们将为每个进程分配100毫秒(时间片)。...例如,听音乐解码过程也许会在大核执行,这就造成了不必要功耗增加。这就是我们需要为big.LITTLE设备使用新调度器原因,新调度器才能够以节能方式识别和利用核差异。...它不仅可以多核CPU分散任务,而且为了确保更快地完成时间敏感型任务,来决定是否增加感知负载。这样,用户使用前台应用程序和服务不会减慢速度,也不会引起不必要性能问题。

3.4K50

你应该知道关于 CPU 一些基本知识~

---- 关于CPU和程序执行 CPU计算大脑。 1、程序运行过程,实际是程序涉及到、未涉及到一大堆指令执行过程。...6、CPU进行进程切换时候,需要将寄存器中和当前进程有关状态数据写入内存对应位置(内核中该进程栈空间)保存起来,当切换回该进程时,需要从内存中拷贝回寄存器中。...7、这就是冯诺依曼结构图,也就是现在计算结构图。 ? 关于CPU多核和多线程 1、CPU物理个数由主板插槽数量决定,每个CPU可以有多核心,每核心可能会有多线程。...所以,超线程技术主要目的是为了增加流水线(参见前文对流水线解释)更多个独立指令,这样线程1和线程2流水线上就尽量不会争抢该核CPU资源。...所以虽然单核同一时间只能执行一个进程,但线程1和线程2可以互相帮助,加速进程执行。

87320

关于CPU一些基本知识总结

关于CPU和程序执行 CPU计算大脑。 1、程序运行过程,实际是程序涉及到、未涉及到一大堆指令执行过程。...6、CPU进行进程切换时候,需要将寄存器中和当前进程有关状态数据写入内存对应位置(内核中该进程栈空间)保存起来,当切换回该进程时,需要从内存中拷贝回寄存器中。...7、这就是冯诺依曼结构图,也就是现在计算结构图。 ? 关于CPU多核和多线程 1、CPU物理个数由主板插槽数量决定,每个CPU可以有多核心,每核心可能会有多线程。...所以,超线程技术主要目的是为了增加流水线(参见前文对流水线解释)更多个独立指令,这样线程1和线程2流水线上就尽量不会争抢该核CPU资源。...所以虽然单核同一时间只能执行一个进程,但线程1和线程2可以互相帮助,加速进程执行。

64320

大数据并行计算利器之MPIOpenMP

图1 连通域标记示意图 随着所要处理数据量越来越大,使用传统串行计算技术连通域标记算法运行时间过长,难以满足实际应用效率需求。...随着并行计算技术发展,利用不同编程模型,许多数据密集型计算任务可以被同时分配给单机多核或多机多处理器进行并行处理,从而有可能大幅度缩减计算时间。...目前集群计算领域广泛使用MPI来进行并行化,单机领域广泛使用OpenMP进行化,本文针对基于等价对二值图像连通域标记算法进行了并行化设计,利用不同并行编程模型分别实现了不同并行算法,并通过实验对利用不同并行编程模型所实现连通域标记算法进行了性能对比分析...6.2 为什么复杂图计算时间更长? ? 6.3 结果2:单节点环境下,复杂图和简单图加速比 ? 6.4 问题1:为什么会出现超线性加速比? 原因:并查集链表影响。...连通域标记算法很多时间用于对并查集链表进行大量查询和插入操作。 ? 6.5 问题2:为什么复杂图比简单图加速比高? ? 6.6 结果3:集群环境下,复杂图和简单图加速比 ?

2.7K60

Java 并发编程(一):摩拳擦掌

01、为什么需要操作系统 我喜欢写文章(不用纸和笔用电脑了)时候听音乐(不用 MP3 用电脑了),假如电脑只能做一件事情的话,我就只能在写完文章时候再听音乐,或者听完音乐时候再开始写作,这样就很不爽...这意味着,我这台电脑能够同一时间处理一个进程四个线程任务:线程 A 正在读取一个文件,线程 B 正在写入一个文件,线程 C 正在计算一个数值,线程 D 正在进行网络传输。...单核 CPU 运行多线程程序,同一时间只有一个线程跑,系统帮忙进行线程切换;系统给每个线程分配时间片(大概 10ms)来执行,看起来像是同时跑,但实际是每个线程跑一点点就换到其它线程继续跑。...所以效率不会有所提高,线程切换反到增加了系统开销。 那多核 CPU 呢? 当然有优势了!多核需要多线程才能发挥优势(不然巧妇难为无米之炊啊),同样,多线程要在多核才能有所发挥(好马配好鞍啊)。...多核 CPU 多线程不仅善于处理 IO 密集型任务(减少阻塞时间),还善于处理计算密集型任务,比如加密解密、数据压缩解压缩(视频、音频、普通数据等),让每个核心都物尽其用。

40040

别再纠结线程池大小 + 线程数量了,没有固定公式

线程数和CPU利用率小测试 抛开一些操作系统,计算机原理不谈,说一个基本理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程指令 ** 那么理论,我一个线程只需要不停执行指令...CPU执行其他线程,可以提高CPU利用率,同时执行更多线程 I/O 事件频率频率越高,或者等待/暂停时间越长,CPU空闲时间也就更长,利用率越低,操作系统可以调度CPU执行更多线程 线程数规划公式...0<=Ucpu<=1Ucpu=目标CPU利用率,0<=Ucpu<=1 WC=等待时间计算时间比例\frac{W}{C}=等待时间计算时间比例CW=等待时间计算时间比例 如果希望程序跑到CPU...公式很清晰,现在来带入上面的例子试试看: 如果我期望目标利用率为90%(多核90),那么需要线程数为: 核心数12 * 利用率0.9 * (1 + 50(sleep时间)/50(循环50_000_000...流程一般是这样: 分析当前主机上,有没有其他进程干扰 分析当前JVM进程,有没有其他运行中或可能运行线程 设定目标 目标CPU利用率 - 我最高能容忍我CPU飙到多少?

80830

别再纠结线程池大小线程数量了,没有固定公式

线程数和CPU利用率小测试 抛开一些操作系统,计算机原理不谈,说一个基本理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程指令 那么理论,我一个线程只需要不停执行指令...线程数和CPU利用率小总结 上面的例子,只是辅助,为了更好理解线程数/程序行为/CPU状态关系,来简单总结一下: 一个极端线程(不停执行“计算”型操作时),就可以把单个核心利用率跑满,多核CPU...CPU执行其他线程,可以提高CPU利用率,同时执行更多线程 I/O 事件频率频率越高,或者等待/暂停时间越长,CPU空闲时间也就更长,利用率越低,操作系统可以调度CPU执行更多线程 线程数规划公式...0<=Ucpu<=1Ucpu=目标CPU利用率,0<=Ucpu<=1 WC=等待时间计算时间比例\frac{W}{C}=等待时间计算时间比例CW=等待时间计算时间比例 如果希望程序跑到CPU...流程一般是这样: 分析当前主机上,有没有其他进程干扰 分析当前JVM进程,有没有其他运行中或可能运行线程 设定目标 目标CPU利用率 - 我最高能容忍我CPU飙到多少?

1.1K40

多核和多线程那些事

而并行指的是同一时刻,强调是同一个时间点并行运行,很显然,并行要求需要多核,而并发可以单核切换运行程序,由于cpu高速运转,所以看起来并发很类似并行执行,但是本质两者是不同。...多核 具有多个逻辑CPU内核并且可以物理上同时执行多条指令计算处理器。计算“核心数”是计算机拥有的核心总数。...计算机可能具有多个处理器,每个处理器可能具有多个核心;核心数是所有处理器核心总数。 多线程 可以通过同时多个内核运行来利用多核计算程序。...通常,两倍内核等于两倍计算能力(对于支持多线程程序),尽管某些问题受CPU使用率以外因素限制。这些问题将不会带来多线程带来巨大收益。 多线程意义 有时程序需要在特定时间做特定事情。...多线程和多核关系 首先两者本质没有必然联系,多线程可以运行在单核,也可以运行在多核。一个线程可以某一时间一个核心上运行,下一刻另一个核心上运行。 线程是内核调度最小单位。

71010

别再纠结线程池大小线程数量了,没有固定公式

线程数和CPU利用率小测试 抛开一些操作系统,计算机原理不谈,说一个基本理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程指令** 那么理论,我一个线程只需要不停执行指令...线程数和CPU利用率小总结 上面的例子,只是辅助,为了更好理解线程数/程序行为/CPU状态关系,来简单总结一下: 一个极端线程(不停执行“计算”型操作时),就可以把单个核心利用率跑满,多核CPU...CPU执行其他线程,可以提高CPU利用率,同时执行更多线程 I/O 事件频率频率越高,或者等待/暂停时间越长,CPU空闲时间也就更长,利用率越低,操作系统可以调度CPU执行更多线程 线程数规划公式...\frac{W}{C}=等待时间计算时间比例CW=等待时间计算时间比例 如果希望程序跑到CPU目标利用率,需要线程数公式为: Nthreads=Ncpu*Ucpu*(1+\frac{W}{C...流程一般是这样: 分析当前主机上,有没有其他进程干扰 分析当前JVM进程,有没有其他运行中或可能运行线程 设定目标 目标CPU利用率 - 我最高能容忍我CPU飙到多少?

72460
领券