多任务

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
  • linux创建线程失败errno=11

    问 题 为什么一个进程调用pthread create来创建线程 当251次就失败了 失败errno11 Resource temporarily unavailable 原 因 一个进程最多拥有250个线程资源 由于pthread cre
  • 基于百度PaddleHub实现人像美颜V1.0

    AI美颜核心技术之一就是人脸关键点检测 PaddleHub已经开源了人脸关键点检测模型 face landmark localization 人脸关键点检测是人脸识别和分析领域中的关键一步 它是诸如自动人脸识别 表情分析 三维人脸重建及三维
  • UncaughtExceptionHandler 捕获异常线程以及出现异常重启

    1 捕获线程的异常只需要修改Executor产生线程的方式 即为每一个线程添加一个实现了Thread UncaughtExceptionHandler接口的异常处理器来捕获线程发生的异常 出现异常之后在捕捉异常中在重新开启线程即可 例子如下
  • Linux线程编程

    参考 Linux多线程编程初探 作者 峰子 仰望阳光 网址 https www cnblogs com xiehongfeng100 p 4620852 html 目录 线程概述 线程概念 线程与进程区别 为何用线程 线程开发api概要 线
  • 代码运行时 CPU占用率100%的解决方法

    原因 建立连接后启动新的线程 如果线程中有简单粗暴的不含阻塞的while 1 循环 会持续占用CPU 导致CPU占用率极高 解决 在while 1 的大循环中插入一句sleep 1 即阻塞1毫秒 java线程内则使用Thread sleep
  • Python中sklearn版本的升级

    调用sklearn的impute时 发现sklearn中没有impute的模块 from sklearn impute import SimpleImputer 报错 ModuleNotFoundError No module named
  • Python Pandas 处理空数据/缺失数据 dropna fillna,增加/更新列 assign,分层 qcut,向量函数

    Pandas 处理空数据 缺失数据 增加 更新列 分层 向量函数 数据准备 一 处理缺失数据 1 1 去除有缺失数据的行 dropna 1 2 替换缺失数据 fillna 二 增加 更新列 2 1 指定生成列的方式 2 2 复制现有的列生成
  • python 人民币数字转汉字大写金额

    写了那么久的博客 始于Python爬虫 目前专于Java学习 终于有了属于自己的小窝 欢迎各位访问我的个人网站 未来我们一起交流进步 背景 银行在打印票据的时候 常常需要将阿拉伯数字表示的人民币金额转换为大写表示 现在请你来完成这样一个程序
  • C#学习笔记 任务操作

    利用线程 可以方便地进行异步操作 但是线程模型有一个缺点 就是无法处理返回值 要在不同线程之间传递数据比较麻烦 任务则解决了这个问题 完整代码在这里 https github com techstay csharp learning not
  • 线程——一个计数器计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串

    16 一个计数器计数到100 在每个数字之间暂停1秒 每隔10个数字输出一个字符串 public class MyThread extends Thread public void run for int i 0 i lt 100 i if
  • 深入理解计算机系统-笔记

    计算机系统漫游 程序 程序的生命周期从一个源程序 源文件 开始 即程序员利用编辑器创建并保存的文本文件 如文件名为hello c的c语言程序 源程序是由0和1组成的位序列 8个位被组织成一组 称为字节 每个字节表示程序中的某个文本字符 这种
  • 关于tomcat繁忙线程数获取

    在某些情况下 我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控 那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数 首先 我们应该想到tomcat本身是否为我们提供了类似的方法 博主在实际开发中拜
  • Unity协程和线程的区别

    先简要说下结论 协同程序 coroutine 与多线程情况下的线程比较类似 有自己的堆栈 自己的局部变量 有自己的指令指针 IP instruction pointer 但与其它协同程序共享全局变量等很多信息 协程 协同程序 同一时间只能执
  • 多任务:分层特征融合网络 NDDR-CNN

    论文链接 NDDR CNN 论文摘要 In this paper we propose a novel Convolutional Neural Network CNN structure for general purpose multi
  • -day17 面向对象基础

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

    原理 假设我们需要解决这样一个问题 一个列表记录需要处理的任务 一个线程往此列表添加任务 一个线程processTask处理此列表中的任务 这个问题的一个关键点在于processTask怎么判断任务列表不为空 一般有两种方法 一 proce
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • 关于Mysql线程的基本设置

    客户端发起连接到mysql server mysql server监听进程 监听到新的请求 然后mysql为其分配一个新的 thread 去处理此请求 从建立连接之开始 CPU要给它划分一定的thread stack 然后进行用户身份认证
  • 模糊数学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

随机推荐

  • 爬虫工作者必备:使用爬虫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资源 提高程序的执行效率 多任务是指在同一时间内执行多个任务 例如 现在电脑安装的操作系统都是多任务操作系统 可以同时运行着多个软件 多任务的执行方式 并发 并行 是多个任务真正意义