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