文章目錄
函數式編程(Functional Programming)
- 基於lambda演算的一種編程方式
- 程序中只有函數
- 函數可以作爲參數,也可以作爲返回值
- 純函數式的編程語言: LISP Haskell
- python函數式編程只是借鑑了函數式編程的一些特點
- 講解
- 高階函數
- 匿名函數
- 系統高階函數
lambda表達式
-
函數: 最大程度複用代碼
- 存在問題: 如果函數很小,很短,代碼會很囉嗦
- 如果函數被調用的次數少,會造成資源內存浪費
- 對於閱讀者來說,會造成閱讀流程的中斷
-
lambda表達式(匿名函數):
- 一個表達式,函數體簡單
- 不是代碼塊,而僅僅是一個表達式
- 可以有參數,也可以沒有,如果有多個參數,需要用逗號隔開
lambda表達式的用法
- 以lambda開頭
- 緊跟其後的是一定的參數(可有可無)
- 參數後用冒號和表達式分割開
- 只是一個表達式,沒有return
高階函數
- 把函數作爲參數使用的函數
得出結論:
- 函數名稱是一個變量
- funB 和 funA只是兩個名字不一樣的函數,功能完全一樣
- 既然函數名稱是一個變量,我們就可以把這個變量當成參數
系統高階函數 - map
- 原意是映射,map(f,list)
filter函數
- filter()函數,過濾掉不符合要求的元素
- filter(f,list)
- f 作用在每一個list 元素上, 如果是True ,則保留這個元素
- 如果返回False , 則去除這個元素
多線程 vs 多進程
所有案例代碼請在Github尋找
-
程序:一堆代碼以文本形式存入一個文檔
-
進程: 程序運行的一個狀態
- 包含地址空間,內存,數據棧等
- 每個進程由自己完全獨立的運行環境,多進程共享數據是一個問題
-
線程
- 一個進程的獨立運行片段,一個進程可以由多個線程
- 輕量化的進程
- 一個進程的多個現成間共享數據和上下文運行環境
- 共享互斥問題
-
全局解釋器鎖(GIL)
- Python代碼的執行是由python虛擬機進行控制
- 在主循環中稚嫩更有一個控制線程在執行
-
Python包
- thread:有問題,不好用,python3改成了_thread
- threading: 通行的包
- 案例01: 順序執行,耗時比較長
- 案例02: 改用多線程,縮短總時間,使用_thread
- 案例03: 多線程,傳參數
-
threading的使用
- 直接利用threading.Thread生成Thread實例
- t = threading.Thread(target=xxx, args=(xxx,))
- t.start():啓動多線程
- t.join(): 等待多線程執行完成
- 案例04
- 案例05: 加入join後比較跟案例04的結果的異同
- 守護線程-daemon
- 如果在程序中將子線程設置成守護現成,則子線程會在主線程結束的時候自動退出
- 一般認爲,守護線程不中要或者不允許離開主線程獨立運行
- 守護線程案例能否有效果跟環境相關
- 案例06非守護線程
- 案例07守護線程
- 線程常用屬性
- threading.currentThread:返回當前線程變量
- threading.enumerate:返回一個包含正在運行的線程的list,正在運行的線程指的是線程啓動後,結束前的狀態
- threading.activeCount: 返回正在運行的線程數量,效果跟 len(threading.enumerate)相同
- thr.setName: 給線程設置名字
- thr.getName: 得到線程的名字
- 直接繼承自threading.Thread
- 直接繼承Thread
- 重寫run函數
- 類實例可以直接運行
- 案例09
- 案例10, 工業風案例
- 直接利用threading.Thread生成Thread實例
-
共享變量
-
共享變量: 當多個現成同時訪問一個變量的時候,會產生共享變量的問題
-
案例11
-
解決變量:鎖,信號燈,
-
鎖(Lock):
- 是一個標誌,表示一個線程在佔用一些資源
- 使用方法
- 上鎖
- 使用共享資源,放心的用
- 取消鎖,釋放鎖
- 案例12
- 鎖誰: 哪個資源需要多個線程共享,鎖哪個
- 理解鎖:鎖其實不是鎖住誰,而是一個令牌
-
線程安全問題:
- 如果一個資源/變量,他對於多線程來講,不用加鎖也不會引起任何問題,則稱爲線程安全
- 線程不安全變量類型: list, set, dict
- 線程安全變量類型: queue
-
生產者消費者問題
- 一個模型,可以用來搭建消息隊列,
- queue是一個用來存放變量的數據結構,特點是先進先出,內部元素排隊,可以理解成一個特殊的list
-
死鎖問題, 案例14
-
鎖的等待時間問題, v15
-
semphore
- 允許一個資源最多由幾個多線程同時使用
- v16
-
threading.Timer
- 案例 17
- Timer是利用多線程,在指定時間後啓動一個功能
-
可重入鎖
- 一個鎖,可以被一個線程多次申請
- 主要解決遞歸調用的時候,需要申請鎖的情況
- 案例18
-
線程替代方案
-
subprocess
- 完全跳過線程,使用進程
- 是派生進程的主要替代方案
- python2.4後引入
-
multiprocessiong
- 使用threadiing藉口派生,使用子進程
- 允許爲多核或者多cpu派生進程,接口跟threading非常相似
- python2.6
-
concurrent.futures
- 新的異步執行模塊
- 任務級別的操作
- python3.2後引入
多進程
-
進程間通訊(InterprocessCommunication, IPC )
-
進程之間無任何共享狀態
-
進程的創建
- 直接生成Process實例對象, 案例19
- 派生子類, 案例20
-
在os中查看pid,ppid以及他們的關係
- 案例21
-
生產者消費者模型
- JoinableQueue
- 案例22
- 隊列中哨兵的使用, 案例23
- 哨兵的改進, 案例24