Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在本例中多个线程的分布效率不高?

为什么在本例中多个线程的分布效率不高?
EN

Stack Overflow用户
提问于 2020-12-03 12:11:12
回答 1查看 78关注 0票数 0

我有一个测试,为什么我可以运行大约5秒,100%的CPU使用时间在我的一个核心。

这是剧本

代码语言:javascript
运行
AI代码解释
复制
from threading import Thread
from time import time, sleep

def test0():
    start = time()
    a = 0
    for _ in range(int(1e8)):
        a += 1
    print(time() - start)

这是跟踪(Ubuntu20.04系统监视器,有1秒的回收箱)

凉爽的。这事儿可以理解。我的一个CPU的工作时间是100%,持续大约5秒。

现在,如果我尝试运行4个线程,每个线程都执行相同的操作,会发生什么呢?以我目前的知识,我认为它们应该是分配在一个核心上的时间,整个过程大约需要20秒。这是剧本

代码语言:javascript
运行
AI代码解释
复制
def print_after_work(msg):
    a = 0
    for _ in range(int(1e8)):
        a += 1
    print(msg)
    

def test1():
    threads = []
    for i in range(4):
        threads.append(threading.Thread(target=print_after_work, args=[i+1]))
    start = time()
    for thread in threads:
        thread.start()
        sleep(0.2)
    for thread in threads:
        thread.join()
    print(time() - start)

这是痕迹:

因此,我们有4个CPU在大约25%的容量工作。

问题:

  1. 所以Python的threading模块可以将线程移动到除了主进程之外的不同内核上?
  2. 如果是这样的话,那为什么只使用25%的每个核心花了4倍的时间去做呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-05 10:16:00

Python线程不使用多个核心,因为所有线程在内部共享公共数据:Python GIL

您在图中看到的是OS时间划分的聚合效应-- Python进程本身几乎可以肯定地在每个时间片的内核之间被交换。不能保证一个进程将始终与同一核心保持联系。不过,您的图表并没有显示O/S时间序列的粒度。因此,您所看到的是随着时间的推移,4个核心的聚合,这意味着您将得到每个CPU的25%或相当于一个CPU的100% --正如您在Python多线程上所期望看到的那样,当进程本身被调度时,线程都与同一个CPU挂钩。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65133401

复制
相关文章
为什么LINUX系统普及度不高?
Linux普及度不高主要说的在桌面版里面,在服务器以及移动设备端有些非常大的占比,特别是移动端占比,所有的安卓手机设备都是基于Linux内核,单纯的说Linux系统普及度不高明显存在问题。Linux桌面版推广不起来主要是应用生态系统无法构建,就拿国内来讲安装一个Linux系统里面常见的工具几乎都用不了,所以在桌面版几乎很难推广起来,这就是很多人说的普及度不高原因。
程序员互动联盟
2020/04/03
2.5K0
免费的SSL证书为什么推荐度不高?
随着互联网的飞速发展,网站数量也呈现出爆发式的增长,这使得隐私安全问题日益凸显。在此背景下,SSL证书的重要性不言而喻。通过使用SSL证书,您可以放心地输入个人信息,避免遭受不法分子的窃取,极大地保障了您的隐私安全。
稀糊牛肉粥
2023/10/07
3430
免费的SSL证书为什么推荐度不高?
什么是线程组,为什么在 Java 中不推荐使用?
线程组是使用 Java 线程进行管理和组织的一种模型。Java 中的线程组是一个 ThreadGroup 类对象,它充当了一个父容器,可以将同一类线程分成一组,并提供追踪这些线程状态、统计信息及管理这些线程的方法。在线程组中,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。
用户1289394
2023/08/22
3910
什么是线程组,为什么在 Java 中不推荐使用?
为什么TCP在高时延和丢包的网络中传输效率差?
说明:有同学私信问到,为什么TCP在高时延和丢包的网络中传输效率差? Google可以搜到很多的信息,这里转译了部分IBM Aspera fasp技术白皮书的第一章节内容,作为参考。 在这个数字世界中
云语科技
2018/04/14
4.9K0
为什么TCP在高时延和丢包的网络中传输效率差?
Redis:为什么说Redis单线程效率高
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!
新码农
2021/01/03
9300
Python多线程的效率
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
Wu_Candy
2022/07/04
6240
Python多线程的效率
数据采集时使用HTTP代理IP效率不高怎么办?
在进行数据采集时,使用HTTP代理 可以帮助我们实现隐私保护和规避封禁的目的。然而,有时候我们可能会遇到使用HTTP代理 效率不高的问题,如连接延迟、速度慢等。本文将为您分享解决这一问题的实用技巧,帮助您提高数据采集效率,让代理 发挥更大的作用。
用户614136809
2023/10/07
1640
localtime在多线程中的问题
碰到一个奇怪的问题,通过localtime生成本地日期时间打日志,结果日志会出现非北京时间,好奇去查了一个,结果发现此函数是非线程安全函数,原来代码如下:
XiaoA
2023/08/09
5500
在Oracle中,如何提高DML语句的效率?
若是批量处理海量数据的话通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交。下面介绍一下提高DML语句效率的常用方法。
AiDBA宝典
2023/08/10
2410
在Oracle中,如何提高DML语句的效率?
Netty在Dubbo中的线程名称
在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用.
书唐瑞
2022/06/02
1.4K0
Netty在Dubbo中的线程名称
分布式系统中的线程与进程
  虽然进程构成了分布式系统中的基本组成单元,但是操作系统提供的用于构建分布式系统的进程在粒度上还是太大了,而就粒度而言,将每个进程细分为若干控制线程的形式则更加合适。
用户3003813
2018/09/06
9460
分布式系统中的线程与进程
多线程是同时执行多个线程的吗
相信多线程各位大佬都用过,不管是在单核cpu还是多核cpu上都可以执行,但是多线程是同时执行多个线程的吗?
余生大大
2022/11/02
1.1K0
108-多线程的效率
python的多线程有一个GIL(全局解释器锁),使得多个线程,某一时刻只有一个线程发送给CPU处理。所以多线程不适用计算密集型应用,更适合IO密集型应用。 以下两次计算5000万次加法运算和不用多线程相比,没有效率的提升。因为CPU有上下文切换,甚至可能多线程更慢。
凯茜的老爸
2018/09/11
4600
ArrayList在Java多线程中的应用
开发中,存在这样的业务逻辑,类似倒金字塔结构,下层数据需要基于上层的数据进行逻辑计算。设计思路是:定义一个全局变量upLayerList,来保存上一层的数据。每一层计算仅需要知道upLayerList就可以,不用关心上一层数据怎么获取。当前层计算完毕后,把结果赋值给upLayerList,留给下一层使用。
用户2146693
2019/08/08
1.5K0
ArrayList在Java多线程中的应用
不高兴的小明
小明又出问题了。妈妈认为聪明的小明应该更加用功学习而变的更加厉害,所以小明除了上学之外,还要参加妈妈为他报名的各科复习班。另外每周妈妈还会送他去学习朗诵、舞蹈和钢琴。但是小明如果一天上课超过八个小时就会不高兴,而且,上得越久就会越不高兴。假设小明不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下小明下周的日程安排,看看下周他会不会不高兴;如果会的话,哪天最不高兴。
书童小二
2018/09/03
4910
在DB-Engines的排名不高,ClickHouse还值得关注吗?
比一比,排老几;看一看,谁最慢。 我:"老大,最近ClickHouse很火啊,咱不试试吗??" 中台架构师:"哦?CK吗?那是个啥玩意呀??" 我:"是CH!!一款OLAP数据库!!" 中台架构师:
Nauu
2020/02/13
1.7K0
在DB-Engines的排名不高,ClickHouse还值得关注吗?
在MapReduce中利用MultipleOutputs输出多个文件
用户在使用Mapreduce时默认以part-*命名,MultipleOutputs可以将不同的键值对输出到用户自定义的不同的文件中。
星哥玩云
2022/07/03
2.2K0
在MapReduce中利用MultipleOutputs输出多个文件
在Servlet的init方法中创建线程
 servlet代码如下: package com.weichat.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.se
庞小明
2018/03/07
2.9K0
多线程在iOS开发中的应用
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
公众号iOS逆向
2021/08/25
1.4K0
多线程在iOS开发中的应用
点击加载更多

相似问题

Python多线程效率不高

114

多线程效率不高:调试假共享?

25

为什么这段代码效率不高?

40

为什么MultiThreading在我的代码中效率不高?

19

Python多线程算法工作效率不高。

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档