机器学习方向函数式编程+多线程

函数式编程(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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值