2020-08-07

参考博客:
https://www.cnblogs.com/yswenli/p/11987377.html
https://www.cnblogs.com/wisdomqq/archive/2012/03/26/2412349.html
https://www.cnblogs.com/scy251147/archive/2012/03/03/2378477.html

1. 异步编程的相关概念

1.1 并发、并行、异步、多线程的概念

  1. 并发:对于某个系统,需要同时处理同个用户请求,多个用户请求的过程和处理多个用户请求的过程就叫并发。
  2. 并行:同一时刻有多件事情同时被执行,这些指令可能执行于同一CPU的多核上,或者多个CPU上,或者多个物理主机甚至多个网络中。
  3. 异步:和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。异步不一定是多线程的,单线程也可以异步,通过线程切换,可以“同时”处理多个任务。异步和并行并不是完全互斥的,有重合的情况;两种概念只是侧重点不同。
  4. 多线程:一般指同一进程中多个线程协作运行。

2. 直接使用多线程的异步方式

3. 基于BackgroundWorker的异步方式

3.1 BackgroundWorker类介绍

BackgroundWorker类后新建另一个线程,在后台持续运行某项工作,不持续和主线程进行通信。BackgroundWorker类结果如下图所示:
1)四个属性
- WorkerReportsProgress(R/W):表示后台线程的进度信息是否汇报给主线程。
- WorkerSupportsCacllation(R/W) :表示后台线程是否支持在主线程中取消。
- IsBusy®:表示后端线程是否忙(是否完成)
- CancellationPending®:表示是否在主线程中取消了后台线程。
2)三个事件(由主线程指定)

DoWork:用于承载异步操作。当调用BackgroundWorker.RunWorkerAsync()时触发。需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避免于用户界面交互,而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted事件中。对应的委托类型如下,sender表示调用对象(即BackgroundWorker本身),DoWorkEventArgs包含三个参数:
Argument表示

  1. 基于BeginInvoke和EndInvoke的异步方式

  2. 基于Task的异步方式
    Task是基于任何的异步模式的中心组件之一,表示异步方式的单个操作。

  3. 并行计算

  4. 计时器

异步编程

async方法在开始时以同步方式执行,在async方法内部,await关键字对它参数执行一个异步等待,它首先检查操作是否已经完成,如果完成,就继续运行(同步方式),否则,会暂停async方法,并返回.留下一个未完成的task,一段时间后,操作完成,async方法就恢复执行.

任务和线程的区别:
1、任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。

 2、任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。

Task 类表示通常以异步方式执行的单个操作,

并行,一般指并行计算,是说同一时刻有多条指令同时被执行,这些指令可能执行于同一CPU的多核上,或者多个CPU上,或者多个物理主机甚至多个网络中。

多线程,一般指同一进程中多个线程(包含其数据结构、上下文与代码片段)协作运行。在多核计算机中多个线程将有机会同时运行于多个核上,如果线程中进行的是计算,则行成并行计算。

异步

使用线程异步化

APM模式(就是BeginXXX和EndXXX成对出现。)
EAP模式(就是Event based, 准确说来就是任务在处理中或者处理完成,会抛出事件)
Task

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值