多線程與多進程

  不管是進程仍是線程咱們均可以循環開啓多條,對於何時使用進程何時使用線程這個問題上:答案就是,咱們在遇到計算密集型問題時使用多進程,遇到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)
相關文章
相關標籤/搜索