機器學習方向函數式編程+多線程

函數式編程(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尋找

  • https://github.com/Dinosaurcity/multithreading

  • 程序:一堆代碼以文本形式存入一個文檔

  • 進程: 程序運行的一個狀態

    • 包含地址空間,內存,數據棧等
    • 每個進程由自己完全獨立的運行環境,多進程共享數據是一個問題
  • 線程

    • 一個進程的獨立運行片段,一個進程可以由多個線程
    • 輕量化的進程
    • 一個進程的多個現成間共享數據和上下文運行環境
    • 共享互斥問題
  • 全局解釋器鎖(GIL)

    • Python代碼的執行是由python虛擬機進行控制
    • 在主循環中稚嫩更有一個控制線程在執行
  • Python包

    • thread:有問題,不好用,python3改成了_thread
    • threading: 通行的包
    • 案例01: 順序執行,耗時比較長
    • 案例02: 改用多線程,縮短總時間,使用_thread
    • 案例03: 多線程,傳參數
  • threading的使用

    • 直接利用threading.Thread生成Thread實例
      1. t = threading.Thread(target=xxx, args=(xxx,))
      2. t.start():啓動多線程
      3. t.join(): 等待多線程執行完成
      4. 案例04
      5. 案例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, 工業風案例
  • 共享變量

    • 共享變量: 當多個現成同時訪問一個變量的時候,會產生共享變量的問題

    • 案例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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章