不管是進程仍是線程咱們均可以循環開啓多條,對於何時使用進程何時使用線程這個問題上:答案就是,咱們在遇到計算密集型問題時使用多進程,遇到io密集型問題時使用多線程。網絡
計算密集型問題:計算密集型任務的特色是要進行大量的計算,消耗CPU資源,好比計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也能夠用多任務完成,可是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,因此,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。多線程
IO密集型問題:IO密集型,涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特色是CPU消耗不多,任務的大部分時間都在等待IO操做完成(由於IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,好比Web應用。IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間不多,所以,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,徹底沒法提高運行效率。對於IO密集型任務,最合適的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。app
# coding:utf-8 import threading,time lock = threading.Lock() ls = [i for i in range(10)] #[1,2,3,4,5,6,7,8,9] # def getValue(): # global ls # if len(ls): # a = ls[-1] # print('線程:%s 刪除 %s'%(threading.current_thread().name,a)) # time.sleep(1) # ls.remove(a) def get(): global ls lock.acquire() # 開始上同步鎖 try: if len(ls): a = ls[-1] print('線程:%s 刪除 %s' % (threading.current_thread().name, a)) time.sleep(1) ls.remove(a) finally: lock.release() # 釋放同步鎖 if __name__=='__main__': while True: # 開啓多線程的方法,咱們可使用循環來開啓多線程,及多進程也是如此。 t = [] for i in range(1,4): t1 = threading.Thread(target=get,name='Thread-%s'%i) t.append(t1) t1.start() # 最後咱們循環來等待他們運行結束在執行下面的內容。 for item in t: item.join() if len(ls) == 0: break print(ls)