精华内容
下载资源
问答
  • 先了解下CPU的简单运行原理:它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成...再了解下单线程和多线程的区别:先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能...

    先了解下CPU的简单运行原理:

    它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务;但是可以将多个任务交替执行,比如上一个时间片段内运行A任务,下个时间片段可以运行B任务,交替执行,因为时间片段很短,所以感觉就是同时在进行了。

    再了解下单线程和多线程的区别:

    先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能过一辆车,多进程则表示多个车道,可以同时过多辆车;那么单线程和多线程意义严格上来说不是进程这样的理解,因为进程内的线程同一时间点只能运行一个,不存在同时进行,CPU给我们的感觉的同时进行,只是它运行的非常快,交替执行多个线程差别可能是毫秒、微秒的区别,所以感觉不到差别,他们在同时进行。

    接着就产生了单线程和多线程的疑惑:

    既然上述说了,多线程并不是多个线程并发在同一时间点运行,而是CPU有计划的交替执行各个多线程,那多线程的优势在哪里?比如python里,从上运行到下调用多次同一个函数是个单线程,和把几次调用函数写成多线程,依据上述理论,这里的CPU运行时间并没有变快啊,因为多线程不能并发运行,也是一个个线程类交替执行完成啊,甚至多线程可能更慢,因为它还要花时间去管理交替执行任务上,不要怀疑,事实上就是如此,那么我们使用多线程的意义在哪里?

    这里需要了解下GIL:

    Python是解释型语言,那么它在运行的时候就需要解释器了,简单描述下GIL,即global interpreter lock,全局解释器锁,就是python在运行的时候会锁定解释器,就是说在运行的时候只能是一个线程,锁死了,切换不了;每个线程在运行之前都要申请GIL,那么就必须要等上一个线程释放这把锁你才可以申请到,然后执行代码,执行完后,你再交给下一个线程,让它去执行代码,过程如下:

    设置GIL -> 切换到一个线程去执行 -> 运行 -> 把线程设置为睡眠状态 -> 解锁GIL

    然后再次重复以上步骤。

    IO密集型任务多线程比单线程要快太多:

    貌似多线程比单线程还要耗CPU,而且运行速度又没变快,甚至更慢,这是相对于计算密集型任务(要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力)来说的,像这类计算密集型任务由于主要消耗CPU资源,python用多线程效率不会提高,甚至是会更慢,原理见上述GIL;

    还有一种IO密集型任务,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度),99%的时间都花在IO上,花在CPU上的时间很少;

    原谅我不自觉的想到了爬虫,爬虫是典型的IO密集型任务,多线程的发送请求情况下:发送一个请求到收到服务器的响应数据取决于网络的快慢,那么发送一个请求之后就是等待服务器的响应了,期间会释放GIL锁,其他线程就可以申请到这把锁,进行发送请求了,重复上述操作直到最后一个请求,那么就等同于非常短的时间内,CPU发送了多个请求,接下来就是等待服务器的响应;那么如果是单线程呢?它发送一个请求后就在那里等着服务器响应,直到服务器有返回数据到客户端后,才会释放GIL锁,接着继续下一个请求,只能是一个个的排队,直到最后一个执行完,显而易见,这里的线程相当并发请求了,比单线程要快的多。

    综上所述:

    在处理计算密集型任务时,python的多线程劣与单线程,性能表现比单线程要差;

    在处理IO密集型任务时,python的多线程优与单线程,性能表现比单线程要好太多;

    展开全文
  • 多线程还是单线程

    2021-01-14 16:58:45
    一个典型的游戏服务器设计中,一般都是用的多线程,服务器中一般运行两类线程,N个SOCKET IO线程,1个逻辑线程,IO线程接受客户端发来的信息,通过消息队列发送给逻辑线程处理后,再发送消息给客户端,发送消息这里...

    一个典型的游戏服务器设计中,一般都是用的多线程,服务器中一般运行两类线程,N个SOCKET IO线程,1个逻辑线程,

    IO线程接受客户端发来的信息,通过消息队列发送给逻辑线程处理后,再发送消息给客户端,发送消息这里一般是IO线程处理实际发送。

    其实我认为,如果逻辑线程都是消耗的CPU运算资源的话,服务器完全采用单线程的方式来做。

    首先,我们看IO处理,基本就是数据入队、出队,send、recv操作,作为服务器的SOCKET处理一般都是异步SOCKET,也就是说,send、recv操作只是将信息copy到socket底层的发送接收缓冲区去了,不存在IO堵塞的问题。

    然后,我们再来看逻辑处理,前面已经说了,采用单线程的前提是逻辑处理只是消耗CPU运算资源,那么,不管你开几个线程,对单核的CPU来说,它的处理速度就是这么多,并不会因为你线程开的越多,就处理的越快。

    因此我们可不可以这样说呢,在单核机器上,只消耗CPU运算的服务,多线程并不比单线程能提高多少效率。

    接下来,我们再讨论下多核的情况,你肯定要想,我这台服务器是4个双核CPU,就只跑一个单线程的服务器不是亏死了,多线程多好,我开8个线程,就能很好的利用我的机器啦。是啊,我也觉得这样很好,不过在LINUX、UNIX下,对线程的支持并不像WINDOWS下那么好,LINUX、UNIX下一般都是用LWP(轻量级进程)的方式来支持多线程程序的,Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,一定程度上也弥补了这一缺陷。同时,滥用多线程也会造成不必要的上下文切换,不必要的同步机制的引入(如pthread_mutex),让程序频繁的在内核和用户间频繁切换。另外,从开发角度来看,单线程开发比多线程环境开发更不容易出错和更加健壮。

    在游戏服务器架构中,为了提高玩家在线人数,实现负载均衡,现在一般都是采用分布式的多进程服务器集群的方式,我们来看看服务器集群中,每个服务进程是采用多线程的方式还是单线程的方式好呢?我觉得,对于有慢速IO访问的需求的应用进程,多线程肯定比单线程好,最典型的情况就是数据库访问这块,完全可以采用N个DB线程,一个逻辑线程的架构,而对只是消耗CPU运算资源的应用进程,尽量单线程就行了,如果觉得单线程负载不行的话,完全可以分成多个进程来跑。。

    以上只是我自己的一些看法,表达有限,欢迎指正。。。

    展开全文
  • 该测试用例分别使用单线程和多线程进行 a 的递增,b 的递减操作,我们通过控制循环次数,来比较相同次数下,串行和并行所花时间。 public class TimeTest { public final int count = 1000000; public stati

    多线程一定比单线程快吗?

    我们知道,使用多线程,可以同时执行多个任务,从表面上看,多线程明显是要快于单线程的。但是,多线程的创建,上下文的切换也是需要开销的,所以多线程不一定比单线程快,接下来我们来看一个简单的测试用例。

    该测试用例分别使用单线程和多线程进行 a 的递增,b 的递减操作,我们通过控制循环次数,来比较相同次数下,串行和并行所花时间。

    public class TimeTest {
        public final int count = 1000000;
    
        public static void main(String[] args) throws InterruptedException {
            TimeTest timeTest = new TimeTest();
            System.out.println("执行 " + timeTest.count + " 次");
            timeTest.serial();	//串行
            timeTest.parallel();	//并行
        }
    
        public void serial() {
            int a = 0;
            int b = 0;
            long l = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                a++;
            }
    
            for (int i = 0; i < count; i++) {
                b--;
            }
    
            System.out.println("串行----->" + (System.currentTimeMillis() - l));
        }
    
        public void parallel() throws InterruptedException {
            int b = 0;
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    int a = 0;
                    for (int i = 0; i < count; i++) {
                        a++;
                    }
                }
            });
            long l = System.currentTimeMillis();
            thread.start();
            for (int i = 0; i < count; i++) {
                b--;
            }
            thread.join();	//等thread线程执行完毕再输出时间差
            System.out.println("并行----->" + (System.currentTimeMillis() - l));
        }
    }
    

    输出结果:

    count100100001000005000001000000
    单线程(ms)00224
    多线程 (ms)00232

    由上表可以发现,执行次数在 50w 次左右,单线程比多线程快,100w 左右,多线程比单线程快,所以,多线程不一定比单线程快。

    注:以上测试结果对比可能不太明显,计算时间差时可以使用 System.nanoTime(),单位精确到纳秒级。

    展开全文
  • 线程技术已经不是什么新鲜事物了,但普通用户可能与双核心技术区分不开。例如开启了超线程技术的Pentium4530与PentiumD530在操作系统中都同样被识别为两颗处理器,它们究竟是不是一样的呢?这个问题确实具有迷惑性...

    超线程技术已经不是什么新鲜事物了,但普通用户可能与双核心技术区分不开。例如开启了超线程技术的Pentium 4 530与Pentium D 530在操作系统中都同样被识别为两颗处理器,它们究竟是不是一样的呢?这个问题确实具有迷惑性。

    其实,可以简单地把双核心技术理解为两个"物理"处理器,是一种"硬"的方式;而超线程技术只是两个"逻辑"处理器,是一种"软"的方式。 其实这方面更详细的还可以在52硬件论坛查到(http://bbs.52hardware.com)

    从原理上来说,超线程技术属于Intel版本的多线程技术。这种技术可以让单CPU拥有处理多线程的能力,而物理上只使用一个处理器。超线程技术为每个物理处理器设置了两个入口-AS(Architecture State,架构状态)接口,从而使操作系统等软件将其识别为两个逻辑处理器。这两个逻辑处理器像传统处理器一样,都有独立的IA-32架构,它们可以分别进入暂停、中断状态,或直接执行特殊线程,并且每个逻辑处理器都拥有APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器)。虽然支持超线程的Pentium 4能同时执行两个线程,但不同于传统的双处理器平台或双内核处理器,超线程中的两个逻辑处理器并没有独立的执行单元、整数单元、寄存器甚至缓存等等资源。它们在运行过程中仍需要共用执行单元、缓存和系统总线接口。在执行多线程时两个逻辑处理器均是交替工作,如果两个线程都同时需要某一个资源时,其中一个要暂停并要让出资源,要待那些资源闲置时才能继续。因此,超线程技术所带来的性能提升远不能等同于两个相同时钟频率处理器带来的性能提升。可以说Intel的超线程技术仅可以看做是对单个处理器运算资源的优化利用。

    而双核心技术则是通过"硬"的物理核心实现多线程工作:每个核心拥有独立的指令集、执行单元,与超线程中所采用的模拟共享机制完全不一样。在操作系统看来,它是实实在在的双处理器,可以同时执行多项任务,能让处理器资源真正实现并行处理模式,其效率和性能提升要比超线程技术要高得多,不可同日而语。

    展开全文
  • Node.js采用事件驱动异步I/O的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事。nodejs实现异步、非阻塞:nodejs其实只有js执行是单线程,I/O显然是其它线程。js执行线程是...
  • 某些编程语言被设计为可以将并发任务彼此隔离,这些语言通常称为函数...与在任务操作系统中分叉外部进程不同,线程机制是在由执行程序表示的单一进程中创建任务。这种方式产生的一个好处是操作系统的透明性,这对J...
  • 据我了解,我已经编写了简单的单线程和多线程程序,以检查执行速度.但是我的单线程程序执行速度比多线程程序要好,请看下面的程序,并提及是否有任何错误.单线程:import java.util.Calendar;public class NormalJava {...
  • Python单线程多线程

    2021-01-07 12:04:25
    单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比。 #使用单线程串行方式执行 import time def get_page(str): print('正在下载:',str) time.sleep(2) print('下载成功:',str) ...
  • 而 Node.js 仅仅只运行在一个单线程中,使用非阻塞的异步 I/O 调用,所有连接都由该线程处理,在 libuv 的加分下,可以允许其支持数万并发连接(全部挂在该线程的事件循环中)。做一个简单的计算: 假设是普通的Web...
  • 线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库。而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread。 不建议你用这个,不过还是介绍下了,如果想...
  • 某些需要用到多线程的地方也有相应的解决方案替代方案。多线程并不总是比单线程优,多线程可能会引入其他问题(例如:两个线程同时调用一个类里的同一个方法时,可能出现死锁的情况)。你可以这样理解 对应一个客户...
  • 一、线程、进程、多线程1、线程与进程定义进程:进程是系统进行资源分配调度的基本单位,是操作系统中一个运行的程序,是线程的容器;线程:线程是处理机调度的最小单位,包含在进程中,是进程中实际运作单位;一...
  • 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会...一般常用的缓存服务器有Redis、Memcached等,就redis单线程,这篇文章做一个简单介绍Redis采用的是基于内存的采用的是单进程单线程模型的KV 数据库,由...
  • 使用单线程模型能带来更的可维护性,方便开发调试; 使用单线程模型也能并发的处理客户端的请求;使用多线程模型带来的性能提升并不能抵消它带来的开发成本维护成本 Redis 服务中运行的绝大多数操作的性能...
  • 最近在B部门做项目,用到的平台框架都是基于进程模式的,在以前的A部门做过的项目都是多线程模式的,在使用的过程中,也思考了一些问题,引发了对这两种类型的线程的对比自己的一些看法(仅是个人观点)。...
  • python多线程单线程效率低的原因是:GIL python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁 - 最开始时候设计GIL是为了数据安全。python为了数据安全设计了这个 GIL - 每个 CPU在同一时间...
  • 尽管 Node.js 是单线程的,但是大多数用于后端开发的编程语言都提供多线程来处理应用程序操作。 为什么单线程有利于后端开发? 开发人员更容易实现应用程序。我们的应用程序在生产过程中不会突然遇到意外的竞争...
  • 文章目录1 Redis为什么是单线程的1.1 官方解释1.2 Redis单线程优势1.3 Redis 不仅仅是单线程1.4 Redis的性能瓶颈2 IO多路复用2.1 文件描述符文件句柄2.2 什么是IO多路复用?2.3 Redis的IO多路复用3 多线程IO多路...
  • 多进程还是多线程

    2021-03-10 04:24:50
    就像莎士比亚的“To be, or not to be, that is thequestion”始终困扰着哈姆雷特,对于“进程还是线程?...由于这个问题很容易引发口水战,事先声明如下:多进程和多线程,无法一概而论地说谁比谁。因...
  • 单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理,后面的才会执行。Java示例:public class SingleThread {public static void main(String[] args) {for (int i = 0; i < 10000; i++) ...
  • 多线程的实现使用场景

    万次阅读 2021-06-09 22:06:20
    多线程的实现使用场景一、多线程实现方式1.1 Thread实现1.2 Runnable实现二、多线程的使用场景1.多线程使用场景1.1 多线程应该最多的场景:1.2多线程的常见应用场景:2.多线程小案列2.1 多线程计算2.2 多线程实现...
  • 多线程内存访问是否比单线程内存访问更快?假设我们使用的是C语言.一个简单的例子如下.如果我有一个巨大的数组A,我想将A复制到与B大小相同的数组B.使用多线程单线程更快地进行内存复制吗?有多少线程适合进行这种...
  • 下面从单线程和多线程两个方面实现定时器的功能。1、单线程(schedule)首先我们需要一个单独的定时任务类,继承TimerTask,用来表示具体的定时任务,单独提出来封装成一个类,方便管理和实现:import java.util.Timer...
  • Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,...所以,在Redis 6.0 推出之后,我想去了解下为什么采用多线程,现在采用的多线程和以前版本有什么区别?为什么这么晚才使用多线程? Redis
  • 最近在研究Spring Boot中的异步处理,发现涉及到异步和多线程的很多知识点,就先写几篇关于异步与多线程的文章,带大一起回顾或学习一下相关的知识点。下面开始正文内容: 前言 在本文中,我们通过一些通俗易懂的...
  • 前提:spring定时任务,默认是多任务单线程执行,也就是串行执行的 当前需求: 1. 多任务多线程执行(不同的定时任务并行执行) 2.同一个定时任务单线程执行(保证一个定时任务A在执行完成前,A的下一次执行...
  • 单核多线程与多核多线程总有同学对于单核多线程和多核多线程有点误区,因为会听到一些同学问为什么核能处理多线程,下面会通俗说明下。线程和进程是什么线程是CPU调度和分配的基本单位(可以理解为CPU只能看到线程)...
  • 先说结论:main方法启动后,jvm会开启个守护线程,但main方法中的代码是被单线程执行的。 上代码: 下面这段代码通过java提供的线程管理类ThreadMXBean中的dumpAllThreads方法返回所有活动线程线程信息,并打印...
  • 对于问多进程和多线程之间的差别的问题,其实我们只要表明我们所知道的多进程和多线程各自的优点就可以了. 一.多线程的优点 1. 线程间通信会更加灵活 (包括进程间通信在内还可以使用全变量函数传参来实现) 这里...
  • 多线程与MQ

    2021-03-16 19:10:23
    我在多线程环境中使用MQSeries Perl模块时出现问题。在这里我曾尝试过:多线程与MQ在不同的线程中创建两个句柄与$mqMgr = MQSeries::QueueManager->new()。我认为这会给我两种不同的MQ连接,但是在第二次调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,055,607
精华内容 422,242
关键字:

多线程和单线程哪个好