python——線程與多線程基礎

  咱們以前已經初步瞭解了進程、線程與協程的概念,如今就來看看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()
threading Code

 

 參考文獻:code

    python線程指南:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html協程

     武老師內部專享文章:python線程、進程和協程:http://www.cnblogs.com/wupeiqi/articles/5040827.html

相關文章
相關標籤/搜索