zoukankan      html  css  js  c++  java
  • 多线程/多进程/协程

    占用的资源:进程>线程>协程


    进程:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文

    进程的颗粒度太大,每次都要有上下的调入,保存,调出。

    线程:一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段

    https://www.zhihu.com/question/25532384/answer/81152571--zhonyong的回答

    进程只是资源分配的单位,线程才是cpu执行的单位

    所以一般情况下,线程是可以用到多核的

    只不过,在python中就比较特殊,本来创建了多个线程,但python解释器对外声称每个时间片只有一个线程要运行,所以对cpu来讲,只能看到一个线程,就变成单线程了;都是GIL搞的鬼

    (GIL锁原因:刚开始单线程够用了,而且完美解决线程安全问题;现在就苦逼了。。。)

    基于这种情况,出现了补救措施:multiprocessing

    python解释器给multiprocessing.Process的每个对象都给了一把锁玩,所以是真的多任务


    并发/并行:多个任务,一个核执行就是并发;每个任务都有一个核执行,就是并行

    python中的多线程就是并发,多进程才是并行

    即并行/并发与是不是线程没关系,只和任务数/核心数有关系;如果没有GIL,多线程也能实现并行

    (之前以为只要是多线程就一定是并发,即单个cpu手忙脚乱一会执行这个一下,一会又去执行那个一下;实际上,cpu的眼里只有线程,所以才说线程是cpu调度的单位)


    单线程/多线程:

    代码是计算密集型的,单线程比多线程快,多线程执行1000命令后就会被GIL切换掉,而切换是要消耗资源的;

    计算密集型的多任务:multiprocessing创建多进程,真的多任务,每个进程有各自的GIL

    代码是io密集型的,多线程更快,因为有的切换,单线程都没得切换,只能等

    io密集型的线程与协程:协程更快,因为是在线程内切换,线程层面都不切的

    但一般程序并不是纯io,也是有计算的,所以这就是协程的缺点,毕竟是单线程的;所以线程的优势就又体现出来了


    只能这么比较通俗的讲,底层还有用户线程/内核线程什么的 (这篇看着还不错,基本清晰),即该开始只有进程,没有线程,但进程太麻烦了,所以应用级搞了个线程,但内核不支持线程这个东西,依旧按进程来调;后来内核支持了线程,即调的是线程了

    最根本的还是要看一本操作系统原理的书,才能理解透彻了

  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/justaman/p/11479963.html
Copyright © 2011-2022 走看看