回调函数

Node.js学习笔记(4)——除了HTTP(服务器和客户端)部分

谁说胖子不能爱 提交于 2020-02-18 19:44:04
很多node入门的书里面都会在介绍node特性的时候说:单线程,异步式I/O,事件驱动。 Node不是一门语言,它是运行在服务器端的开发平台,官方指定语言为javascript。 阻塞和线程: 线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,全力执行这个I/O操作,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞。当其他完成之后,系统再恢复它对cpu的控制权,继续执行,这就是同步I/O或者阻塞式I/O。 所以这个模式之下,一个线程只能处理一个任务,要么是计算操作,要么是I/O操作等等。每当有多的请求发过来的时候,必须多加线程用来响应。 同样的,在异步式或者非阻塞式,系统对所有的I/O操作部阻塞,而是将这个耗费时间和资源的操作报告给OS,就继续执行下一条语句。当OS执行完毕这个I/O操作之后,以事件的形式通知原来请求挂载I/O操作的线程,线程会在特定的时间处理这个事情。所以,必线程必须有事件循环,不断检查有没有未处理的事件。 所以这个模式下,cpu的核心利用率永远是100%,I/O以事件形式通知。 总结:多线程同步式I/O阻塞模式通过加开线程响应更多的请求,好处是在多核cpu的情况下利用更多的核。 单线程模式异步式I/O非阻塞式一个线程永远在执行计算操作

C# 一个帮您理解回调函数的例子(新手必看)

假如想象 提交于 2020-02-16 16:32:36
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 回调函数Demo { /* 回调函数的作用,1.分装;2.异步;3.扩展具体方法。 * 通过一个委托给出实现功能模块扫遵循的协议:参数和返回类型,而这个委托我们就叫做回电函数,本质上就是一个委托。 * 回调函数只是一个标准,一个占位符。而具体工作的方法只要是满足回调函数(也就是委托)给出的协议即可。 * 可见一个回调函数(委托)可以有多个具体方法。这也满足多播委托的特点 * * 本例我们通过回调函数实现2个数的运算 * 比如说主程A写主模块,而程序员B写2个数之间的操作,比如+,-,*,/,拼接等等。 * 而回调函数就是给出A,给B的一个协议。我不管你具体实现什么运算,也不管你怎么实现。 * 我只需要告诉你。输入2个int数 ,给我返回一个int类型的运算结果 * * 相关知识点回顾: * 1、在其他其他平级空间中使用必须是静态方法,否则就将这个方法写到一个类里,再在使用的地方实例化这个类 */ class Program { //1.定义一个委托,相当于定义了一个协议参数,返回值的协议,做什么事怎么做A不关心 public delegate int Del_CaluationCallback

JavaScript 异步处理(ES6)

感情迁移 提交于 2020-02-16 12:58:45
一、Promise 是什么? 不是讲 async/await 吗?为什么会提到 Promise ? 实际上, async/await 是 Promise 的一个拓展,所以,想要更好地理解 async/await ,需要先理解 Promise 。 我们先看看 Promise 是什么。先在浏览器中使用 console.dir(Promise) 打印出 Promise 对象的所的属性和方法: 从打印结果可以看出, Promise 是一个构造函数,它自己本身有 all 、 reject 、 resolve 等方法,原型上有 catch 、 finally 、 then 等方法。所以 new 出来的 Promise 对象也就自然拥有 catch 、 finally 、 then 这些方法。从上图中可以看到, then 方法返回的是一个新的 Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用链式写法,即 then 方法后面再调用另一个 then 方法。 Promise 的中文意思是承诺,这种**“承诺将来会执行”**的对象在 JavaScript 中称为 Promise 对象。简单说就是一个容器,里面保存着某个未来才会执行的事件(通常是一个异步操作)的结果。 Promise 对象有两个特点: 对象的状态不受外界影响。 Promise 对象代表一个异步操作,有三种状态

js中异步和同步的区别

时光怂恿深爱的人放手 提交于 2020-02-16 10:38:21
执行环境 :js的执行环境是单线程的,它一次只能执行一个任务,按照主线程里执行栈里任务的排列来执行。 同步任务 :是按照主线程里执行栈里任务的排列来执行的。 异步任务 :遇到异步任务,先不放入主线程,因为异步任务不知道什么时候才能获取结果,这样会影响页面正常显示。当异步任务执行后,进入阻塞状态,主线程会继续向下执行代码,当异步任务执行完成,把对应的回调函数封装成事件放入任务队列中,当主线程里的任务执行完毕,才去任务队列中找事件中的回调函数来执行,这些事件的回调函数都执行完后,相当于完成了一次事件循环。 同步和异步的区别 :同步会阻塞后续代码的执行,异步不会阻塞后续代码的执行。 前端会用到异步的地方 : 1.setInterval 、 setTimeout setInterval ( function ( ) { console . log ( "a" ) } , 3000 ) / / 每隔3秒会把回调函数封装成事件放入任务队列中 2.ajax请求 $ . get ( "./data.json" , ( data ) => { console . log ( data ) } ) / / 当请求完成把回调函数封装成事件放入任务队列中 3.事件绑定 document . getElementById ( "btn" ) . addEventListener ( "click" ,

线程池理解

久未见 提交于 2020-02-15 19:43:32
Linux 多线程编程之 线程池 的原理和一个简单的C实现,提高对多线程编 程的认知,同步处理等操作,以及如何在实际项目中高效的利用多线程开 发。 1. 线程池介绍 为什么需要线程池??? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务 器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求, 但处理时间却相对较短。 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创 建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就 是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时 间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执 行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态, 这笔开销将是不可忽略的。 线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对 多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是, 因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的 延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过 适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时, 就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从 而可以防止资源不足。 2. 线程池结构 2.1 线程池任务结点结构

OpenCV图像载入、显示和输出到文件以及滑块的使用

陌路散爱 提交于 2020-02-15 13:28:15
图像载入 imread()函数 Mat imread(const string& filename, int flags = 1); 第一个参数为文件名 第二个参数为载入标识 flags > 0 返回一个3通道的彩色图像 flags = 0 返回灰度图像 flags < 0 返回包含Alpha通道的加载图像 若要载入最真实无损的源图像,可flags = 2 || flags = 4 imshow()函数 void imshow(const string& winname, InputArray mat); 第一个参数:const string& 类型的winname,填需要显示的窗口标识名称。 第二个参数:InputArray类型的mat,填写要显示的图像 namedWindow函数 void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE) 第一个参数,const string&类型的name,填写被用做窗口的标识符的窗口名称。 第二个参数,int 类型的flags,窗口的标识,默认为WINDOW_AUTOSIZE,还可以填如下几种值: WINDOW_NORMAL,用户可以改变窗口的大小 WINDOW_AUTOSIZE,窗口大小会自动调整以适应所显示的图像。并且用户不能手动改变改变窗口的大小 WINDOW

java架构之路-(netty专题)netty的基本使用和netty聊天室

淺唱寂寞╮ 提交于 2020-02-14 11:35:59
上次回顾:   上次博客,我们主要说了我们的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基于NIO二次封装的异步非阻塞,最重要的就是我们的NIO,脑海中应该有NIO的模型图。 Netty概念:   Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。 “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。---摘自百度百科。 基本使用:   我们来看一下代码吧   服务端: package com.xiaocai.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel

ESP8266 SDK开发: 外设篇-定时器,延时

假如想象 提交于 2020-02-14 01:14:49
延时 /** * @brief Delay function, maximum value: 65535 us. * * @param uint16 us : delay time, uint: us, maximum value: 65535 us * * @return null */ void os_delay_us(uint16 us); 软件定时器 代码 #include "esp_timer.h" /** * @brief 定时器回调函数 * @param parg:传入的配置os_timer_setfn函数最后的参数 * @param None * @param None * @param None * @retval None * @warning None * @example **/ void os_timer_one_function(void *parg) { printf("parg:%s\n", parg);//打印一下传过来的参数 } //配置定时器 os_timer_setfn(&os_timer_one,os_timer_one_function,"yang");//os_timer_one:定时器结构体变量 os_timer_one_function:回调函数 yang:传给回调函数的参数 //使能定时器 os_timer_arm(&os

随笔5

泪湿孤枕 提交于 2020-02-13 16:14:47
随笔5 2009-02-13 16:28 (分类: 工作资料 ) *************************************** 2月13 windows应用程序WinForm **************************************** 宿主程序: WinForm是.Net开发平台中对Windows Form的一种称谓。.Net 为开发WinForm的应用程序提供了丰富的Class Library(类库)。这些 WinFrom 类库支持RAD(快速应用程序开发),这些类库被封装在一个名称空间之中,这个名称空间就是System.Windows.Forms。在此名 称空间中定义了许多类,在开发基于.Net的GUI应用程序的时候,就是通过继承和扩展这些类才使得我们的程序有着多样的用户界面。 **类似于java中的GUI,但是可以拖动按钮,比java方便很多** 分部类:类的合并 -------------------------------------------- // // button1 // this.button1.Location = new System.Drawing.Point(184, 52); this.button1.Name = "Test"; this.button1.Size = new System.Drawing

JavaScript 数组的方法总结

淺唱寂寞╮ 提交于 2020-02-13 07:43:34
数组方法大全 (一)检测方法 检测一个对象是否为一个数组 ① instanceof 操作符 let arr = [] arr instanceof Array // true ② Array.isArray( ) let arr = [] Array.isArray(arr) // true IE9以下不支持该方法 (二)转换方法 ① toString( ) 返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串 var arr = [1,2,3,4]; console.log(arr.toString()); // '1,2,3,4' ② join( ) 将数组转换为字符串,默认情况下与toString()的结果一致,不一样的是join()方法可以指定具体的分隔符,分隔符作为方法的实参以字符串形式传入。 ③ valueOf( ) 返回原数组 (三)栈方法 ① push( ) 可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度, 该方法会改变原数组。 ② pop( ) 从数组末尾删除一个元素,返回被删除的元素, 该方法会改变原数组。 (四)队列方法 ① shift( ) 删除数组的第一个元素,并将该元素返回, 该方法会改变原数组。 ② unshift( ) 在数组开头添加一个或多个元素,并返回新数组的长度, 该方法会改变原数组。 (五)重排序方法 ①