threading是對thread的封裝。web
一、開啓線程:多線程
t=threading.Thread(target=sayhi,args=('hh',)) t.start()
或者先建一個Thread的繼承類,而後用這個類中的start()方法打開;socket
二、主進程下開啓子進程:函數
t=multiprocessing.Process(target=work)
t.start()
程序會先執行主程序的語句,再執行此子進程的目標函數work();ui
三、t.setDadmon() 設置守護進程;必須在start()以前設置;若是爲True則主程序不用等此線程結束後再結束主程序;spa
1 t.join() 等待線程結束; 2 t.isAlive() 返回線程是否活動; 3 t.getName() 返回線程名。 4 t.setName() 設置線程名。 5 threading.currentThread() 返回當前線程變量; 6 threading.enumerate() 返回一個包含正在運行線程的列表; 7 threading.activeCount() 返回正在運行的線程數量; 8 threading.Semaphore(5) 限制最大鏈接數爲5,semaphore是一個acquire,release的計數器;
多線程用於IO密集型,如socket,爬蟲,web線程
多進程用於計算密集型,如金融分析code
四、同步鎖對象
R=threading.Lock() R.acquire() ''' 對公共數據的操做 ''' R.release()
用於對共享資源同步訪問的限制,只有當一個線程訪問完畢後另外一個線程才能訪問。blog
五、死鎖
使用RLock()代替Lock()可解決,由於RLock()使資源能夠被屢次acquire,但只有直到一個線程全部的acquire都被release以後其餘線程才能得到資源。
而使用Semaphore(n)則可限制資源的同時最大可訪問線程數;
六、Event對象
用於多線程之間的通訊和同步,初始狀況下event對象中信號標誌爲False;
Event對象方法:
1 isSet() 返回event的狀態值; 2 wait() 若是event.isSet() == False 將阻塞線程,即等待; 3 set() 設置event的狀態值; 4 clear() 恢復event的狀態值爲False;
七、線程queue
實例queue.Queue() 先進先出;
實例queue.LifoQueue() 後進先出;
實例queue.PriorityQueeu() 接受一個優先級參數,根據優先級大小決定順序;