pyhon——進程線程、與協程基礎概述

  一直以來寫博客都是實用主義者,只寫用法,沒信心寫原理,可是每一次寫做業的過程都有一種掘地三尺的感受,終於,寫博客困難症重症患者經歷了漫長的思想鬥爭,仍是決定把從網上淘到的各類雜貨和本身的總結放在一塊兒,寫一次原理文。。。算是繼上次裝飾器以後的第二次挖祖墳事件,只是此次是主動挖~~~php

開胃菜——同步和異步html

  記得剛畢業那會兒,同事問我,知不知道同步和異步,我一臉茫然的搖搖頭,換來的是一臉看白癡的表情,如今漸漸明白了一些,以爲並無多高深。舉個栗子:你叫我去吃飯,我聽到了就馬上和你去吃飯,若是我沒聽到,你就一直叫我,直到我聽見和你一塊兒去吃飯,這個過程叫同步;異步過程指你叫我去吃飯,而後你就去吃飯了,而無論我是否和你一塊兒去吃飯。而我獲得消息後可能當即就走,也可能過段時間再走。python

  因此嘍,咱們不要被那些看起來晦澀的專業名詞嚇到了,不過就是吃頓飯的事兒,同事又是一臉看白癡的表情→_→:吃貨學python就只能想到吃。。。瀏覽器

  哈哈,官方的解釋搬過來:安全

    同步是指:發送方發出數據後,等接收方發回響應之後才發下一個數據包的通信方式。多線程

    異步是指:發送方發出數據後,不等接收方發回響應,接着發送下個數據包的通信方式。異步

初始化進程、線程與協成的概念socket

什麼是進程?性能

  進程,是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。前面的話我也沒懂,用非官方的白話來解釋就是——執行中的程序是進程,好比qq不是進程,可是當咱們雙擊qq開始使用它的時候,它就變成了一個進程。咱們寫的python程序,只有當咱們執行它的時候,它纔是進程。咱們正在執行的IE瀏覽器,QQ,pycharm都是進程,從操做系統的角度來說,每個進程都有它本身的內存空間,進程之間的內存是獨立的。spa

什麼是線程?

  線程,有時被稱爲輕量級進程,是程序執行流的最小單元。咱們能夠理解爲,線程是屬於進程的,咱們平時寫的簡單程序,是單線程的,多線程和單線程的區別在於多線程能夠同時處理多個任務,這時候咱們能夠理解爲多線程和多進程是同樣的,我能夠在個人進程中開啓一個線程放音樂,也能夠開啓另外的線程聊qq,可是進程之間的內存獨立,而屬於同一個進程多個線程之間的內存是共享的,多個線程能夠直接對它們所在進程的內存數據進行讀寫並在線程間進行交換。

進程與線程之間的關係

先推薦一個連接,這篇文章用漫畫的形式講解了進程與線程的關係:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

    

  如上圖,僞裝咱們已經看完了上面的鏈接。這裏來爲偷懶的同志們解釋一下,左圖爲進程與線程之間的關係。每一個進程都有屬於本身的線程,至少一個。右圖是進程、單線程進程,多線程進程在內存中的狀況。

關於python線程的那個傳說:

  在python界一直有着一個古老的傳說,那就是python的多線程是雞肋,那麼這個傳說的信度到底有多少呢?若是咱們的代碼是CPU密集型(涉及到大量的計算),多個線程的代碼頗有可能是線性執行的,因此這種狀況下多線程是雞肋,效率可能還不如單線程,由於有context switch(其實就是線程之間的切換和線程的建立等等都是須要消耗時間的);可是:若是是IO密集型,多線程能夠明顯提升效率。例如製做爬蟲,絕大多數時間爬蟲是在等待socket返回數據。這個時候C代碼裏是有release GIL的,最終結果是某個線程等待IO的時候其餘線程能夠繼續執行。

  那麼,爲何咱們大python會這麼不智能呢?咱們都知道,python是一種解釋性語言,在python執行的過程當中,須要解釋器一邊解釋一邊執行,咱們以前也介紹了,同一個進程的線程之間內存共享,那麼就會出現內存資源的安全問題,python爲了線程安全,就設置了全局解釋器鎖機制,既一個進程中同時只能有一個線程訪問cpu。做爲解釋型語言,python能引入多線程的概念就已經很是不易了,目前看到的資料php和perl等多線程機制都是不健全的。解釋型語言作多線程的艱難程度能夠想見。。。具體下面的連接推薦:python的最難問題。

   正是因爲python多線程的缺陷,咱們在這裏須要引入協成的概念。

什麼是協程?

  協程是一種用戶態的輕量級線程。若是說多進程對於多CPU,多線程對應多核CPU,那麼事件驅動和協程則是在充分挖掘不斷提升性能的單核CPU的潛力。咱們既能夠利用異步優點,又能夠避免反覆系統調用,還有進程切換形成的開銷,這就是協程。協程也是單線程,可是它能讓原來要使用異步+回調方式寫的非人類代碼,能夠用看似同步的方式寫出來。它是實現推拉互動的所謂非搶佔式協做的關鍵。對於python來講,因爲python多線程中全局解釋器致使的同時只能有一個線程訪問cpu,因此對協程需求就相比於其餘語言更爲緊迫。

進程、線程與協程

  從硬件發展來看,從最初的單核單CPU,到單核多CPU,多核多CPU,彷佛已經到了極限了,可是單核CPU性能卻還在不斷提高。server端也在不斷的發展變化。若是將程序分爲IO密集型應用和CPU密集型應用,兩者的server的發展以下:

    IO密集型應用: 多進程->多線程->事件驅動->協程
    CPU密集型應用:多進程-->多線程                                                                                                                                                                    

  調度和切換的時間:進程   >   線程   >  協程

偷懶的同窗看這裏→_→:不須要實現複雜的內存共享且需利用多cpu,用多進程;實現複雜的內存共享及IO密集型應用:多線程或協程;實現複雜的內存共享及CPU密集型應用:協程

  開始寫連載的博客了,哈哈,感受仍是短短的文章可讀性強~~~

  進程、線程和協成的詳解以下:

    進程篇:http://www.cnblogs.com/Eva-J/articles/5110844.html

    線程篇——基礎篇:http://www.cnblogs.com/Eva-J/articles/5109737.html

    線程篇——進階篇:http://www.cnblogs.com/Eva-J/articles/5110160.html

    線程篇——線程池:http://www.cnblogs.com/Eva-J/articles/5106564.html

    協程篇:http://www.cnblogs.com/Eva-J/articles/5110969.html

  參考文獻:
    同步和異步相關:http://jingyan.baidu.com/article/295430f1cbfa8f0c7e0050ab.html

    python的最難問題【譯】多線程相關:http://www.oschina.net/translate/pythons-hardest-problem

    淺談對協程的理解:http://blog.csdn.net/qq910894904/article/details/41699541

相關文章
相關標籤/搜索