咱們以前已經初步瞭解了進程、線程與協程的概念,如今就來看看python的線程。下面說的都是一個進程裏的故事了,暫時忘記進程和協程,先來看一個進程中的線程和多線程。這篇博客將要講一些單線程與多線程的基礎,它們在執行中對cpu資源的分配,幫助還不瞭解多線程的小夥伴一招get寫多線程代碼的技能。已經瞭解的請自行跳過。html
單線程python
從上面的圖中咱們能夠看出,這段代碼執行了10秒多,這就是一段單單線程的一條道走到黑的代碼,它們順序執行,該sleep的時候就sleep,該print的時候就print。右邊的圖是python執行的時候所佔用的cpu的狀況。多線程
多線程ide
可是,咱們是沒法忍受一共打印10個數,每一個數之間還要sleep這個事實的,因此又出現了多線程,當一個線程sleeping的時候,cpu就去執行其餘線程的內容了。例如:this
看上面的圖,咱們引入了threading模塊,並使用Thread類實現了一個多線程的程序,這時,咱們僅僅用了9毫秒的時間,就執行完了10個數字的打印。是由於咱們將print這件事情,放到了多個線程中去執行,那麼這幾個線程就幾乎同步去作事,表面上線程都在執行完打印以後進入了休眠狀態,可是一個線程休息的間隙,cpu就能夠去完成其餘線程的任務了。看最右側的時間圖,我放大了時間軸,其實每個顏色塊就表明了他們在cpu中執行時佔用的時間,它們之間的差異很小,大概是秒的-3次方這個數量級,足矣被咱們忽略了,因此咱們感受他們是同時執行的,當線程執行sleep的時候,他們也幾乎會同時開始計時,同時結束。咱們看中間的結果圖,打印的並不像上面單線程那麼漂亮,這也是各個線程搶佔輸出資源的結果。因而咱們知道了,多線程的執行幾乎是同步的,而且共享內存,可是它會產生資源搶佔的狀況。spa
get一段多線程代碼線程
看上面的圖,就是這樣,其實開啓一個線程很是簡單,只須要引入一個threading包,而後初始化一個Thread的對象,將方法名和其參數做爲Thread類初始化的參數傳進去,再使用Thread的對象調用start方法,咱們就啓動了一個新的線程。咱們能夠在本身的程序中按照需求起一個或不少個線程。就像上面那樣。3d
1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 __author__ = 'Eva_J' 4 5 import threading 6 import time 7 8 def printNum(a): 9 print 'num:',a 10 time.sleep(1) 11 12 def printStr(str1,str2): 13 print str1,':',str2 14 time.sleep(1) 15 16 t_0 = threading.Thread(target=printNum ,args= (999,)) 17 t_0.start() 18 19 t_1 = threading.Thread(target=printStr ,args= ('this is the arg','string',)) 20 t_1.start() 21 22 for a in range(10): 23 t = threading.Thread(target=printNum ,args= (a,)) 24 t.start()
參考文獻:code
python線程指南:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html協程
武老師內部專享文章:python線程、進程和協程:http://www.cnblogs.com/wupeiqi/articles/5040827.html