-
多任務
什麼是多任務
同時做多件事件(做個多個任務),運行多個方法
多任務的原理
併發:假的多任務,時間片的輪轉,快速的交替運行任務
並行:真的多任務,一個核處理一個任務
實現多任務的三種方式
線程
進程
協程
- 線程
概念:程序執行的最小單位,依賴於進程
特點
程序運行起來,就給它創建了一個主線程,等待子線程結束後再結束
共享全局變量,通過args參數給線程傳遞數據
從系統開銷講,進程>線程>協程
互斥鎖
主要解決了資源競爭的問題
使用互斥鎖最主要注意:死鎖問題
原因:兩個線程都在等待對方釋放鎖
解決方案:
寫代碼設計的時候避免
設置超時時間
銀行家算法
進程
概念:它是代碼和資源的集合,分配資源的最小單位,可以在任務列表中查看進程
特點
程序運行起來,就會給其創建一個主進程,等待子進程結束後,再結束
進程調用start()方法後就進入了運行態
寫時拷貝處理數據,通過args給進程傳遞數據
從系統開銷講,進程>線程>協程
進程間通信使用Queue
作用:多個進程之間傳遞數據
寫法
創建隊列對象q=multiprocessing.Queue()
一個進程給隊列中放消息q.put()
另一個進程從隊列中去消息q.get()
進程池
爲什麼要用進程池?
減少了創建、銷燬進程的次數,從而提交效率
原理
一次性在進程池中創建多條進程,循環着去使用
寫法
創建進程池po=multiprocessing.Pool()
加入任務 po.aplay_async()
關閉po.close
應用場景
任務比較多的時候
不知道有多少個任務的時候
- 協程
什麼是可迭代對象
一個普通的對象實現了iter內置函數
什麼是迭代器
一個普通的對象實現了iter和next內置函數
迭代器的特點
保存的是生成數據的方式,而不直接存儲數據
好處:節省系統空間
什麼是生成器
它是一個特殊的迭代器
yield
一個普通的函數裏面寫了yield的話,他就是一個生成器模板
執行函數遇到yield會阻塞
調用next()或者send()會解阻塞
利用yield做協程
寫多個函數,每個函數中都寫yield,函數執行時遇到yield就會阻塞
然後交替着題調用不同任務的next()方法,這樣就用協程實現了多任務
原理:
利用線程的空閒時間去執行其他的任務
特點:
協程依賴於線程,線程依賴進程
從系統開銷講,進程>線程>協程
實現協程的三種方式
yield next() send()
greenlet
gevent
gevent.spawn(函數名).join()
gevent.joinall([gevent.spawn(函數名)])