zoukankan      html  css  js  c++  java
  • 重述协程

    开启进程和线程的流程

    开启一个进程,从内存中划分出一块,每个进程都有一个主线程,一个pycharm就相当于是一个进程,里面的一个py文件的代码,就相当于是一个线程。当你运行这个py文件的时候,就开启了一个Cpython解释器,这个解释器也是一个进程,现在就是把这个py文件,在解释器这个进程里面开启了一个线程来运行这个py文件。如果要开多线程,也是在解释器里开,而不是在pycharm这个进程中开,一般情况下,所有语言都不会去开多进程,因为它耗费的资源实在是太大了,所以都会开多线程来达到并发并行的目的,但又因为 python 的特殊性,导致python的多线程在很多情况下没有什么用,因此就有了协程。

    重述协程

    之前知道的,可以开多进程,每个进程又可以开多线程,线程又可以开协程,多进程可以占用多个cpu的核,一个进程同时只能占用一个核,因为每个进程默认有一个主线程,由于存在GIL全局解释器锁,所以导致了多线程也只能占用一个核。

    什么是协程?

    协程就是把多个任务都放在一个线程下面跑,计算密集型没用,甚至更差,io密集型有用,他可以用模块自动实现在遇到io的时候再任务间切换,而不被操作系统发现,尽可能长时间的占用cpu。

    什么时候用多进程?

    有多核,而且任务是计算密集型的时候。这样可以并行的去执行这些任务,如果是io密集型的话,浪费了开启多进程的资源,因为io的时候cpu是不执行的。

    什么时候用多线程?

    需要对同一个内存空间进行操作时,io密集型任务。

    什么时候用协程?

    当任务是io密集型的时候。

    为什么不用多线程而用协程?

    1、因为协程的切换是在应用程序之间切换,和多线程的cpu的切换相比起来快得多。

    2、协程是在一个线程下的,意味着他已经拿到了线程锁,比如这时候有三个一样的任务都是循环200000次 x = x+1 ,因为协程中任务之间的切换是遇到io才会切换的,所以在循环的时候不会切换,就算这个时候占用cpu时间过长,而导致cpu切换到其他线程上,协程也会保留当前的状态,下次cpu再切到这里的时候继续运行。(总而言之,不需要锁了)

    3、尽可能让cpu停留在自己的线程上,因为cpu切走之后,还有其他电脑程序的进程线程在跑,什么时候切回来都不知道,所以多线程会比协程耗费更多的时间。

  • 相关阅读:
    Js特殊字符转义之htmlEscape()方法
    利用Image对象,建立Javascript前台错误日志记录
    html5 实现 文件夹上传
    博客园博客开通了
    js 无刷新文件上传 (兼容IE9 )
    js实现关键词高亮显示 正则匹配
    Python练习六
    Python练习二
    Python练习三
    Python练习四
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11795653.html
Copyright © 2011-2022 走看看