一、threading
問答:
應用程序、進程、線程關係?
爲什麼要使用多個CPU ?
爲什麼要使用多線程?
爲什麼要使用多進程?
java和C#中的多線程和python多線程的區別?
Python GIL?
線程和進程的選擇:計算密集型和IO密集型程序。(IO操作不佔用CPU)
1、Python線程
Threading用於提供線程相關的操作,線程是應用程序中工作的最小單元。
#!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() print 'main thread stop'
上述代碼創建了10個“前臺”線程,然後控制器就交給了CPU,CPU根據指定算法進行調度,分片執行指令。
更多方法:
start 線程準備就緒,等待CPU調度
setName 爲線程設置名稱
getName 獲取線程名稱
setDaemon 設置爲後臺線程或前臺線程(默認)
如果是後臺線程,主線程執行過程中,後臺線程也在進行,主線程執行完畢後,後臺線程不論成功與否,均停止
如果是前臺線程,主線程執行過程中,前臺線程也在進行,主線程執行完畢後,等待前臺線程也執行完成後,程序停止join 逐個執行每個線程,執行完畢後繼續往下執行...
run 線程被cpu調度後執行此方法
2、線程鎖
由於線程之間是進行隨機調度,並且每個線程可能只執行n條執行之後,CPU接着執行其他線程。所以,可能出現如下問題:
#!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time gl_num = 0 def show(arg): global gl_num time.sleep(1) gl_num +=1 print gl_num for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() print 'main thread stop' 未使用線程鎖
#!/usr/bin/env python #coding:utf-8 import threading import time gl_num = 0 lock = threading.RLock() def Func(): lock.acquire() global gl_num gl_num +=1 time.sleep(1) print gl_num lock.release() for i in range(10): t = threading.Thread(target=Func) t.start()