Day01_Python_线程与进程

本文详细介绍了Python中的线程与进程,包括数据类型、numpy和pandas的使用,多进程与多线程的创建、同步及优缺点。讲解了进程的join方法、守护进程、数据共享方式,以及GIL对多线程的影响。同时探讨了进程池的使用,强调了根据任务类型选择多进程或多线程的场景。
python中数据类型
  • 数字: int float 复数 bool

  • 列表

  • 字典

  • 元组

  • 集合

numpy

数据类型:ndarray, 可以定义任何维度

pandas

一维:series

二维:dataframe

三维:multindex 或者叫做 panel

为什么数据分析中不用python内置的数据类型,而使用 numpy 或者 pandas
  • numpy和pandas的数据结构是要 优于 python内置的结构
  • numpy中默认采用多进程的方式处理数据
  • numpy底层是采用c来处理数据
并行:多个cpu同时处理多个程序
并发:一个cpu在一个很小的时间段之内在多个程序之间来回切换执行
__name__的意义:

如果执行执行当前文件 __name__== ‘__main__

如果是在其他文件中执行 __name__ == ‘文件的名称’

多进程的创建方式
  • 导包

    from multiprocessing import Process
    
  • 创建多个函数

  • 创建进程

    # Process函数中必须包含一个 target参数,指定创建进程的函数名称
    p1 = Process(target=run1)
    
  • 执行进程

    p1.start()
    
进程对象的 join 方法的意思: 阻塞进程
获取进程的编号
  • 子进程的编号: os.getpid()
  • 主进程的编号:os.getppid()
带有参数的进程
  • 传递非关键字参数

  • 传递关键字参数

    def run1(name, age=0):
        print('run1--', name, age)
        
        
    # 给进程传递非关键字参数,需要定义 args 参数,类型是 元组或者列表
    # 给进程传递关键字参数,需要定义 kwargs 参数,类型是 字典
    p1 = Process(target=run1, args=('a',), kwargs={'age':10})
    
守护进程
  • 作用: 当主进程结束之后,不管子进程也没有结束,当前所有进程全部结束
  • 方法:子进程对象.daemon = True
可变对象:可以对数据内部进行增删改操作
  • 字典
  • 列表
  • 集合
不可变对象:不能对数据内部进行更改
  • 字符串
  • 元组
  • 整型
浅拷贝:把对象的一维数据拷贝一份,放入到新的内存中
  • 变量.copy()

    a = [1,2,[3,4]]
    b = a.copy()
    
  • 变量[:]

    a = [1,2,[3,4]]
    b = a[:]
    
  • copy.copy

    import copy
    a = [1,2,[3,4]]
    b = copy.copy(a)
    
深拷贝: 把对象的所有数据全部拷贝一份,放入到新的内存中
  • copy.deepcopy

    import copy
    a = [1,2,[3,4]]
    b = copy.deepcopy(a)
    
能够使用 with 语法,必须在类中定义两个方法
  • __enter__

  • __exit__

    class A:
        
        def __enter__(self):
            # 实例化
        
        def __exit__(self):
            # 关闭句柄
    
多进程之间数据不共享,如果需要多进程之间数据共享,最常用的三种方式
  • 管理器 manager
  • 队列 queue
  • 管道 pipe
  • 套接字 sock (不常用)

进程池

  • 为什么要使用进程池:因为不会频繁的创建和销毁进程,所以节省资源

  • 进程池中一般创建多少个进程,效率最高: 电脑中 cpu核数的 两倍

  • 创建进程的步骤

    # 1,导包
    from multiprocessing import Pool
    
    
    if __name__ == "__main__":
        
        # 2,创建进程池
        # Pool方法中的参数就是 初始化创建 进程的数量
        pool = Pool(3)
      
      
      	# 3,用进程池执行进程
        # apply_async 中第一个参数就是 函数的名称
        pool.apply_async(函数名称)
        
        # 4,先关闭进程池
        pool.close()
        
        # 5,等待所有的请求处理完成之后,再去 销毁进程池的资源
        pool.join()
    
闭包一定要满足3个条件
  • 外层函数一定要包含一个内层函数
  • 外层函数一定返回内层函数的函数名称
  • 内层函数一定是使用外层函数的变量
python中的多线程是伪多线程,因为GIL(全局解释性锁)的存在,所以多线程中cpu的执行是并发的,而不是并行的
GIL: 全局解释性锁
多线程的创建方式
  • 导包

    from threading import Thread
    
  • 创建多个线程

    t1 = Thread(target=run1)
    
  • 执行

    t1.start()
    
  • 等待子线程执行完之后,在执行主线程

    t1.join()
    
守护线程
  • 作用: 主线程结束之后,不管子线程也没有结束,整个程序就结束
  • 使用方式: 子线程对象.setDaemon(True)
多线程之间数据是共享的, 但是共享会带来数据错乱,所以必须加锁解决
加锁的方法
  • 加锁:lock.acquire()
  • 释放锁:lock.release()
进程和线程的对比的三个方向

关系对比
区别对比
优缺点对比

关系对比

线程是依附在进程里面的,没有进程就没有线程。
一个进程默认提供一条线程,进程可以创建多个线程。
image-20200823134714393

区别对比

进程之间不共享全局变量
线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 加锁
创建进程的资源开销要比创建线程的资源开销要大
进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
线程不能够独立执行,必须依存在进程中
多进程开发比单进程多线程开发稳定性要强

优缺点对比

进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核

使用场景

计算密集型:CPU 长时间满负荷运行, 如图像处理、大数据运算、科学运算等。使用多进程
I/O 密集型:网络 IO, 文件 IO, 设备 IO 等。使用多线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值