標籤:結束 UI python2 start global span 列印 修改 16px
1、線程鎖
如果多個線程同時要修改一個資料的時候,可能會把資料覆蓋,這個時候就要在改資料的時候加鎖,只同時有一個線程在改這個資料,改完後再解鎖。
在Python2裡面要加鎖,在Python3裡面不用,因為Python3裡面會自動加鎖和解鎖。
在Python2裡面加鎖的代碼如下:
import threading,timenum=1lock=threading.Lock() #申請一把鎖def run(): time.sleep(1) global num lock.acquire() #加鎖 num+=1 lock.release() #解鎖 #在python3裡面可以不加,預設會加上的ts=[]for i in range(50): t=threading.Thread(target=run) t.start() ts.append(t)[t.join() for t in ts]#如果主線程沒有做等待(以上兩句),那麼最後列印的num值是1,因為列印num的時候,子線程因有sleep時間還沒執行完print(num)
2、守護線程
把子線程設定為守護線程,那麼主線程一旦結束,子線程不管有沒有執行完也會結束
import threading,timedef run(): time.sleep(3) print(‘hhh‘)for i in range(50): t=threading.Thread(target=run) t.setDaemon(True) #把子線程設定成為守護線程 t.start()print(‘運行完成‘) #主線程執行完了,子線程也就結束了,所以只會列印這一句
以上代碼,本來在3秒後要輸出hhh,結果因為主線程運行完後,還沒到3秒,hhh還沒列印,子線程也結束了,所以只輸出運行完成
如果以上代碼主線程在輸出運行完成後,等待3秒,那麼子線程就可以執行
import threading,timedef run(): time.sleep(3) print(‘hhh‘)for i in range(50): t=threading.Thread(target=run) t.setDaemon(True) #把子線程設定成為守護線程 t.start()print(‘運行完成‘) #主線程執行完了,子線程也就結束了,所以只會列印這一句time.sleep(3) #因為主線程在列印上一句後,等待了3秒,這時候子線程運行完了,所以子線程的內容也會列印
3、多進程
多進程多用於處理CPU密集型任務
多線程多用於處理I/O密集型任務
import multiprocessing,threadingdef my(): print(‘哈哈哈哈‘)def run(num): for i in range(num): t=threading.Thread(target=my) t.start()if __name__==‘__main__‘: for i in range(5): p=multiprocessing.Process(target=run,args=(6,)) #啟動進程 p.start()
啟動進程,每個進程有6個線程,總共5個進程,最後輸出30次哈哈哈哈
python學習(三十二)線程鎖&守護線程&多進程