多任务

2023-11-01

多任务

1.多任务的概念

多任务的最大好处是充分利用CPU资源,提高程序的执行效率

多任务是指在同一时间内执行多个任务,例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

多任务的执行方式
  • 并发
  • 并行:是多个任务真正意义上的一起执行;

并发:在一段时间内交替去执行任务。

并行:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行

2.进程
1.进程介绍

在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。

一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。

比如:现实生活中的公司可以理解成是一个进程,公司提供办公资源(电脑、办公桌椅等),真正干活的是员工,员工可以理解成线程。

注意:一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程

2.多进程完成多任务
  1. Process进程类的说明
Process([group [, target [, name [, args [, kwargs]]]]])
  • group:指定进程组,目前只能使用None
  • target:执行的目标任务名
  • name:进程名字
  • args:以元组方式给执行任务传参
  • kwargs:以字典方式给执行任务传参

Process创建的实例对象的常用方法:

  • start():启动子进程实例(创建子进程)
  • join():等待子进程执行结束
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

name:当前进程的别名,默认为Process-N,N为从1开始递增的整数,一般不用设置;

2.进程(带参数)创建步骤:

​ 1.导入进程包;

​ 2.通过进程类创建进程对象;

​ 3.启动进程执行任务;

# 导入模块
import time
import multiprocessing


def workFun1(num, name):
    for i in range(num):
        print("%s在敲代码" %name)
        time.sleep(1)


def workFun2(count, name):
    for i in range(count):
        print("%s在看剧" %name)
        time.sleep(1)


if __name__ == '__main__':
    # 2.通过进程类创建进程对象;
    work1_process = multiprocessing.Process(target=workFun1, args=(3,"小廖同学"))
    work2_process = multiprocessing.Process(target=workFun2, kwargs={"count": 3,"name":"小廖同学"})
    # 3.启动进程执行任务;
    work1_process.start()
    work2_process.start()

总结:进程执行带有参数的任务传参有两种形式

1.元组传参:元组传参方式一定要和参数的顺序保持一致;

2.字典方式传参:字典方式传参字典的key值一定要和参数保持一致;

3.进程编号的获取

进程编号:取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。

获取进程编号的两种操作

  • 获取当前进程编号: getpid()
  • 获取当前父进程编号:getppid()
# 导入模块
import time
import multiprocessing
import os


def workFun1(num, name):
    print("敲代码的进程编号:%s" %os.getpid())
    print("敲代码的父进程编号:%s" %os.getppid())
    for i in range(num):
        print("%s在敲代码" %name)
        time.sleep(1)


def workFun2(count, name):
    print("看剧的进程编号:%s" % os.getpid())
    print("看剧的父进程编号:%s" % os.getppid())
    for i in range(count):
        print("%s在看剧" %name)
        time.sleep(1)


if __name__ == '__main__':
    # 2.通过进程类创建进程对象;
    work1_process = multiprocessing.Process(target=workFun1, args=(3,"小廖同学"))
    work2_process = multiprocessing.Process(target=workFun2, kwargs={"count": 3,"name":"小廖同学"})
    # 3.启动进程执行任务;
    work1_process.start()
    work2_process.start()
    print("主进程:%s" % os.getpid())
     
"""
结果:
主进程:19438
敲代码的进程编号:19439
敲代码的父进程编号:19438
小廖同学在敲代码
看剧的进程编号:19440
看剧的父进程编号:19438
小廖同学在看剧
小廖同学在敲代码
小廖同学在看剧
小廖同学在敲代码
小廖同学在看剧
"""
4.进程间不共享全局变量
  1. 进程之间不共享全局变量;

    ​ 创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

  2. 主进程会等待所有的子进程执行结束再结束;

    我们可以设置守护主进程 或者在主进程退出之前 让子进程销毁

    守护主进程:

    • 守护主进程就是主进程退出子进程销毁不再执行

    子进程销毁:

    • 子进程执行结束

代码演示:

# 导入模块
import time
import multiprocessing
import os


def workFun1(num, name):
    print("敲代码的进程编号:%s" %os.getpid())
    print("敲代码的父进程编号:%s" %os.getppid())
    for i in range(num):
        print("%s在敲代码" %name)
        time.sleep(1)


def workFun2(count, name):
    print("看剧的进程编号:%s" % os.getpid())
    print("看剧的父进程编号:%s" % os.getppid())
    for i in range(count):
        print("%s在看剧" %name)
        time.sleep(1)


if __name__ == '__main__':
    # 2.通过进程类创建进程对象;
    work1_process = multiprocessing.Process(target=workFun1, args=(3,"小廖同学"))
    work2_process = multiprocessing.Process(target=workFun2, kwargs={"count": 3,"name":"小廖同学"})
    # 在子进程开始前设置
    # 方式一:设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
    # work1_process.daemon = True
    # work2_process.daemon = True
    # 3.启动进程执行任务;
    work1_process.start()
    work2_process.start()
    print("主进程:%s" % os.getpid())
    # 让主进程等待一秒
    time.sleep(1)
    # 方式二:销毁子进程,手动结束子进程
    work1_process.terminate()
    work2_process.terminate()
    print("主进程执行完毕")
3.线程的介绍

​ 在Python中,想要实现多任务除了使用进程,还可以使用线程来完成,线程是实现多任务的另外一种方式;

1. 线程的概念

​ 线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度 ,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程;

2. 线程总结
  • 多线程是python中实现多任务的一种方式;
  • 线程是程序执行的最小单位;
  • 同属一个进程的多个线程共享进程所拥有的全部资源;
3.多线程完成多任务
  • 导入线程包;
  • 通过线程类创建线程对象;
  • 启动线程执行任务;

线程执行任务并传参有两种方式:

  • 元组方式传参(args) :元组方式传参一定要和参数的顺序保持一致。
  • 字典方式传参(kwargs):字典方式传参字典中的key一定要和参数名保持一致。
import time
import threading


def workFun1(num, name):
    for i in range(num):
        print("%s在敲代码" %name)
        time.sleep(1)


def workFun2(count, name):
    for i in range(count):
        print("%s在看剧" %name)
        time.sleep(1)


if __name__ == '__main__':
    # 创建线程对象
    work1_thread = threading.Thread(target=workFun1,args=(3,"小廖同学"))
    work2_thread = threading.Thread(target=workFun2,kwargs={"count":3,"name":"小廖同学"})
    # 启动线程对象
    work1_thread.start()
    work2_thread.start()
3.主线程和子线程执行顺序

主线程会等待所有子线程执行完毕再结束;

要想主线程不等待子线程执行完毕在结束,可以设置守护主线程

1.参数方式设置守护主线程:daemon = True

2.函数方式设置守护主线程:set.Daemon(True)

# 导入模块
import time
import threading

def get_fun():
    for i in range(10):
        print("小廖同学在敲代码......")
        time.sleep(0.5)

if __name__ == '__main__':
    # 创建子线程对象
    # 1.参数方式设置守护主线程:daemon = True
    # work_thread = threading.Thread(target=get_fun,daemon=True)
    work_thread = threading.Thread(target=get_fun)
    # 2.函数方式设置守护主线程:set.Daemon(True)
    work_thread.setDaemon(True)
    # 启动子线程
    work_thread.start()

    # 延时一秒
    time.sleep(1)
    print("主线执行完毕....")
4.线程执行顺序

线程执行执行是无序的;

# 线程之间的执行顺序
import threading
import time

def get_fun():
    time.sleep(0.5)
    # 获取线程信息
    cureent_thread = threading.current_thread()
    print(cureent_thread)



if __name__ == '__main__':
    # 创建子线程
    for i in range(10):
        # 创建子线程
        sub_thread = threading.Thread(target=get_fun)
        # 启动子线程
        sub_thread.start()
5.互斥锁

​ 1.线程之间共享全局变量数据

​ 多个线程都是再同一个进程中,多个线程使用的资源都是同一个进程中的资源,因此多线程间是共享全局变量

​ 2.线程之间共享全局变量数据出现错误问题,资源竞争问题

​ 解决方法:同步,就是协同步调,按预定的先后次序进行运行,使用线程同步保证同一时刻只能有一个线程去操作全局变量;

​ 3.同步方式:

​ 1.使用join()让主线程阻塞等待;

​ 2.互斥锁;

互斥锁:对共享数据进行锁定,保证同一时刻只有一个线程去操作

注意:互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程进行等待,等锁释放后,再和其它等待的线程再去抢这个锁;

步骤:1.创建互斥锁

​ mutex = threading.lock()

​ 2.上锁

​ mutex.acquire()

​ 3.释放锁

​ mutex.release()

import threading

sum1 = 0
def fun1():
    # 上锁
    mutex.acquire()
    global sum1
    for i in range(1000000):
        sum1 += 1
    print(sum1)
    # 释放锁
    mutex.release()

def fun2():
    # 上锁
    mutex.acquire()
    global sum1
    for i in range(1000000):
        sum1 += 1
    print(sum1)
    # 释放锁
    mutex.release()

if __name__ == '__main__':
    mutex = threading.Lock()
    sum_thread1 = threading.Thread(target=fun1)
    sum_thread2 = threading.Thread(target=fun1)
    sum_thread1.start()
    sum_thread2.start()

​ 死锁:一直在等待对方释放锁的情景就是死锁,死锁会造成应用程序的停止响应,不能再处理其它任务了。

死锁注意点:1.要在合适的地方释放锁;2.死锁一旦产生,程序无法执行;

6.进程和线程对比
1.关系对比
  1. 线程是依附在进程里面的,没有进程就没有线程。
  2. 一个进程默认提供一条线程,进程可以创建多个线程。
2. 区别对比
  1. 进程之间不共享全局变量
  2. 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步
  3. 创建进程的资源开销要比创建线程的资源开销要大
  4. 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
  5. 线程不能够独立执行,必须依存在进程中
  6. 多进程开发比单进程多线程开发稳定性要强
3. 优缺点对比
  • 进程优缺点:
    • 优点:可以用多核
    • 缺点:资源开销大
  • 线程优缺点:
    • 优点:资源开销小
    • 缺点:不能使用多核

注意:

  • 进程和线程都是完成多任务的一种方式
  • 多进程要比多线程消耗的资源多,但是多进程开发比单进程多线程开发稳定性要强,某个进程挂掉不会影响其它进程。
  • 多进程可以使用cpu的多核运行,多线程可以共享全局变量。
  • 线程不能单独执行必须依附在进程里面

4.协程

协程,又称微线程,纤程。英文名Coroutine,协程是python个中另外一种实现多任务的方式。只不过比线程更小占用更小执行单元(理解为需要的资源)。

通俗的理解:

​ 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。

1.协程的优点

最大的优势就是协程极高的执行效率。因为函数切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。协程的优点

最大的优势就是协程极高的执行效率。因为函数切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

特点:

  1. 必须在只有一个单线程里实现并发
  2. 修改共享数据不需加锁
  3. 用户程序里自己保存多个控制流的上下文栈
  4. 附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制))
# 协程一定是并发方式执行多任务
import time

def work1():
    while True:
        print("-----work1-------")
        yield
        time.sleep(0.5)

def work2():
    while True:
        print("-----work2-------")
        yield
        time.sleep(0.5)

def main():
    w1 = work1()
    w2 = work2()
    for i in range(5):
        next(w1)
        next(w2)

if __name__ == '__main__':
    main()

协程greenlet 介绍:

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单。

import greenlet
import time


def work1():
    for i in range(5):
        print("-----work1-------")
        time.sleep(1)
        # 切换到第二个协程执行对应的任务
        g2.switch()


def work2():
    for i in range(5):
        print("-----work2-------")
        time.sleep(1)
        # 切换到第一个协程执行对应的任务
        g1.switch()

if __name__ == '__main__':
    # 创建协程指定对应任务
    g1 = greenlet.greenlet(work1)
    g2 = greenlet.greenlet(work2)
    # 切换到第一个协程执行对应的任务
    g1.switch()
2.gevent

greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库,那就是gevent。

gevent内部封装的greenlet,其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

import gevent
import time
from gevent import monkey

# 让gevent框架识别耗时操作
monkey.patch_all()

# 任务
def work1(num):
    for i in range(num):
        print("-----work1-------")
        time.sleep(1)

def work2(num):
    for i in range(num):
        print("-----work2-------")
        time.sleep(1)
        
if __name__ == '__main__':
    g1 = gevent.spawn(work1, 5)
    g2 = gevent.spawn(work2, 5)

    g1.join()
    g2.join()
3.协程与线程和进程的区别:
  1. 进程是资源分配的单位;
  2. 线程是操作系统调度的单位;
  3. 进程切换需要的资源最大,效率很低;
  4. 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下);
  5. 协程切换任务资源很小,效率高;
  6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多任务 的相关文章

  • Java中的wait()与notify()/notifyAll()

    1 wait 与sleep yield 的不同 调用sleep 和yield 时 线程掌握的对象上的锁不会被释放 而调用wait 时 线程掌握的对象上的锁会被释放掉 这一点是需要注意的 也是有意义的 因为调用wait 会释放锁 所以在一个s
  • c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念

    以下是代码中创建progressbar的实例 int count 0 private void button4 Click object sender EventArgs e Thread th new Thread gt Form for
  • UncaughtExceptionHandler 捕获异常线程以及出现异常重启

    1 捕获线程的异常只需要修改Executor产生线程的方式 即为每一个线程添加一个实现了Thread UncaughtExceptionHandler接口的异常处理器来捕获线程发生的异常 出现异常之后在捕捉异常中在重新开启线程即可 例子如下
  • 计算机操作系统之期末考试复习——进程的基本状态及转换

    进程的基本状态 就绪状态 Ready 进程已处于准备好运行的状态 即进程已分配到除CPU以外的所有必要资源后 只要获得CPU 便可立即执行 执行状态 Running 进程以获得CPU 其程序正在执行的状态 阻塞状态 Block 正在执行的进
  • 【Linux】进程地址空间

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 虚拟地址 二 对进程地址空间的理解 三 32位下的进程
  • 【Unity3D】回合制游戏

    回合制游戏一直在游戏史 至少是在中国的游戏历史上扮演很重要的角色 从仙剑到梦幻 这类游戏深受玩家喜爱 那么在Unity3D中怎么实现呢 下面用一个比较简单Unity3D的一对一回合制游戏来说明这个问题 其实也不难 关键是理清各个处理关系 如
  • Python中sklearn版本的升级

    调用sklearn的impute时 发现sklearn中没有impute的模块 from sklearn impute import SimpleImputer 报错 ModuleNotFoundError No module named
  • jemalloc原理分析

    jemalloc原理分析 转载自http club alibabatech org article detail htm articleId 36 首先介绍一下jemalloc中的几个核心概念 1 arena jemalloc的核心分配管理
  • Python Pandas 行数据筛选方法汇总

    Pandas 行数据筛选 一 准备数据 二 通过逻辑规则筛选 大于 小于等 三 删除重复元素 三 显示最前面 最后面的 n 行 3 1 显示前面 n 行 3 2 显示后面 n 行 四 随机抽取 4 1 随机抽取一定比例 4 2 随机抽取 n
  • 线程(进程)的同步与互斥实例

    1 有一个队列 线程1负责从网络接收分组 并将收到的分组放到队列尾 然后再次从网络中接收下一个到达的分组 并进行同样的队列操作 线程2从此队列头中取出一个分组进行处理 处理完毕后 再次从队列中取出一个分组进行处理 处理完毕后再次从队列头取出
  • JDK1.8 AbstractQueuedSynchronizer的实现分析(上)

    深度解析Java 8 JDK1 8 AbstractQueuedSynchronizer的实现分析 上 作者 刘锟洋 发布于 2014年7月31日 http www infoq com cn articles jdk1 8 abstract
  • MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

    MFC之AfxbeginThread 线程 创建 挂起 释放 结束 退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程 两种方法 使用默认设置 使用自主设置参数 以及一些如同 挂起 释放 边界锁等操作 h文件添加声明
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代
  • 进程的描述与组织

    1 1 1进程的资源 进程需要一定资源才能运行 最重要的资源是内存地址空间 此外还可能需要使用文件 设备等 这些资源均由内核负责管理和分配 分配给进程的资源登记在进程的PCB中 1 进程的地址空间 进程的一个重要构成成分是进程映像 即进程所
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • 线程连接池

    第一种 Executors newCacheThreadPool 可缓存线程池 先查看池中有没有以前建立的线程 如果有 就直接使用 如果没有 就建一个新的线程加入池中 缓存型池子通常用于执行一些生存期很短的异步型任务 package tes
  • 关于Mysql线程的基本设置

    客户端发起连接到mysql server mysql server监听进程 监听到新的请求 然后mysql为其分配一个新的 thread 去处理此请求 从建立连接之开始 CPU要给它划分一定的thread stack 然后进行用户身份认证
  • -day14--模块与内置模块

    day14 模块 课程目标 掌握Python中常用模块的使用方法 今日概要 自定义模块 包 第三方模块 内置模块 1 2 1 自定义模块 1 1 模块和包 import hashlib def encrypt data 数据加密 hash
  • 模糊数学Python(一)模糊运算

    代码 import numpy as np def istype a 判断模糊矩阵a的类型 a np array a s np eye a shape 0 a shape 1 if a gt s all and a T a all retu
  • iOS线程初探(四) GCD 和 NSOperation 小结

    参考资料 关于iOS多线程 看我就够了 GCD 在GCD中 有两个概念很重要 那就是任务和队列 任务 其实就是你需要做的事情 一个Block而已 任务有两种执行方式 同步执行和异步执行 同步执行 会阻塞当前线程 直至该任务执行完成后当前线程

随机推荐

  • 爬虫工作者必备:使用爬虫ip轻松获得最强辅助

    在进行网络数据爬取时 爬虫ip成为了爬虫工作者们的得力辅助 通过使用爬虫ip 可以实现IP地址的伪装和分布式请求 有效规避访问限制和提高爬取效率 本文将为爬虫工作者们分享关于使用爬虫ip的知识 帮助您轻松获取最强辅助 顺利完成数据爬虫任务
  • hdu2036

    函数 语法 result polygonarea Point polygon int N 参数
  • CentOS下ssh sftp配置及权限设置

    运营有异地传输文件的需求 但如果通过QQ等即时通讯软件 不利于文件的集中管理 不方便 而我们办公室的内网机器无法提供外网访问方法 且传输的内容不合适放到公共的网盘或者是云存储上 所以只能用线上负载较低的服务器来承担此项任务 从技术角度来分析
  • openstack安装之对象存储安装笔记

    1 控制节点操作 1 1 先决条件 设置 admin 凭证 获得 admin 凭证来获取只有管理员能执行的命令的访问权限 执行如下命令 root admin openrc 创建身份认证服务的凭证 创建 swift 用户 密码设置为 zhit
  • python按照指定字符或者长度 截取字符串

    1 截取指定位置字符串 Python字符串可以理解为一个数组 获取某一部分的可以使用 str beginIndex endPosition 其中str为需要截取的字符串 beginIndex为需要截取的第一个字符的下标 endPositio
  • Spark入门教程

    1 简介 Apache Spark是一个开源的分布式计算框架 旨在提供快速 通用 易用的数据处理和分析技术 它可以在集群中处理大规模数据 支持多种数据处理模式 如批处理 交互式查询 流处理等 Spark还提供了丰富的API 包括Scala
  • ACM主要赛考察内容

    1 时间复杂度 渐近时间复杂度的严格定义 NP问题 时间复杂度的分析方法 主定理 2 排序算法 平方排序算法的应用 Shell排序 快速排序 归并排序 时间复杂度下界 三种线性时间排序 外部排序 拓扑排序 3 数论 整除 集合论 关系 素数
  • 基于IdentityServer4 实现.NET Core的认证授权

    NET西安社区 博客园 首页 新随笔 联系 管理 基于IdentityServer4 实现 NET Core的认证授权 目录 IdentityServer4是什么 OpenID Connect 和 OAuth2 0是什么 Authentic
  • centos7 samba 离线安装_CentOS7安装配置Samba服务

    接到运营人员需要共享文件的需求 考虑到简单易用的原则 这里选用Samba来做文件共享服务 先介绍下Samba服务 Samba是SMB CIFS 网络协议的重新实现 它作为 NFS 的补充使得在 Linux 和 Windows 系统中进行文件
  • 【电路中的滤波器】1.一阶RC低通滤波器详解

    前言 本文旨在从硬件电路特性 动态系统建模分析 系统传递函数多方面结合的角度来详细总结一阶低通滤波器 目的是从本质上多角度的去解析RC滤波器的原理 帮助自己通过RC低通走入模电频率部分这一 玄学 内容 这将是一个专题 后续将会继续更新各种滤
  • 安装opencv低版本

    opencv安装包 下载站点 https mirrors tuna tsinghua edu cn pypi web simple opencv python 进入之后 会发现opencv python 3 4 1 15 cp36 cp36
  • 人工智能-统计机器学习-特征人脸方法(Eigenface)

    人脸识别之特征人脸方法是一种应用主成份分析来实现人脸图像降维的方法 其本质是用一种称为 特征人脸 eigenface 的特征向量按照线性组合形式来表达每一张原始人脸图像 进而实现人脸识别 由此可见 这一方法的关键之处在于如何得到特征人脸 算
  • 基于pytorch训练图像识别

    1 准备数据集 2 清洗图片 3 划分训练测试数据 4 训练模型 5 保存模型 6 使用模型预测 报错 OSError Unrecognized data stream contents when reading image file 稍微
  • python之导包(库的所在位置,导包原则)

    前言 一 导包 1 含义解释 2 库的所在位置 3 导入 4 导包原则 一 5 导包原则 二 总结 前言 记录一下导包的规则 一 导包 1 含义解释 1 python自带的 不需要安装 直接导入 2 第三方库 先安装 再导入 再使用 3 自
  • mongodb副本集链接报错问题com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a serv

    1 报错信息 Exception in thread main com mongodb MongoTimeoutException Timed out after 30000 ms while waiting for a server th
  • FFplay文档解读-18-音频过滤器三

    26 21 anequalizer 每个通道的高阶参数多频带均衡器 它接受以下参数 params 此选项字符串的格式为 cchn f cf w w g g t f 每个均衡器带由 分隔 均衡器 解释 chn 设置要应用均衡的通道编号 如果输
  • C规范编辑笔记(十一)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 正文 因为太久没有更新了 今天
  • 14.Xaml ProgressBar控件 进度条控件

    1 运行效果 2 运行源码 a Xaml源码
  • js 页面卸载前的信息提示

    a href http www baidu com go a
  • 多任务

    多任务 1 多任务的概念 多任务的最大好处是充分利用CPU资源 提高程序的执行效率 多任务是指在同一时间内执行多个任务 例如 现在电脑安装的操作系统都是多任务操作系统 可以同时运行着多个软件 多任务的执行方式 并发 并行 是多个任务真正意义