多線程編程的使用情境:
任務本質上是非同步,需要有多個並發事務,各個事務的運行順序可以是不確定的,隨機的,不可預測的。這樣的編程任務可以被分成多個執行流,每個流都有一個要完成的目標。
進程:程式以一次執行。
線程:所有的線程運行在同一個進程中,共用相同的運行環境。
python 解譯器中可以運行多個“線程”,但在任意時刻,只有一個線程在解譯器中運行。
python 虛擬機器執行方式:
1 設定GIL
2 切換到一個線程中去運行
3 運行:
a. 指定數量的位元組碼指令,或者
b. 線程主動讓出控制
4 把線程設定為睡眠狀態
5 解鎖GIL
6 再次重複以上所有步驟
常用的多線程模組:thread threading Queue 不推薦使用的是thread模組,另一個不使用thread的原因是它不支援守護線程。
使用thread的案例2個
#!/usr/bin/env pythonimport threadfrom time import sleep,ctimedef loop0(): print 'the loop 0 start: ',ctime() sleep(6) print 'loop 0 is end: ',ctime()def loop1(): print 'the loop 1 start: ',ctime() sleep(4) print 'loop 1 is end: ',ctime()def main(): print 'the main is start: ',ctime() thread.start_new_thread(loop0,()) thread.start_new_thread(loop1,()) sleep(10) #為什麼會有這一段代碼呢,要是沒有它就會怎麼樣呢 (沒有線程同步) print 'main thread is end: ',ctime()if __name__=='__main__': main()
使用線程鎖
#!/usr/bin/env pythonimport threadfrom time import sleep,ctimedef loop0(): print 'the loop 0 start: ',ctime() sleep(6) print 'loop 0 is end: ',ctime()def loop1(): print 'the loop 1 start: ',ctime() sleep(4) print 'loop 1 is end: ',ctime()def main(): print 'the main is start: ',ctime() thread.start_new_thread(loop0,()) thread.start_new_thread(loop1,()) sleep(10) print 'main thread is end: ',ctime()if __name__=='__main__': main()
線程同步,守護線程的知識不是很明了,還學要找點資料補習下。