回调函数

Redis之事件模型

蓝咒 提交于 2019-11-27 19:11:26
介绍 Memcached的底层网络驱动部分直接使用了libevent,其实Redis使用libevent也是可以,仅仅使用其 event_base 完全可以行得通。但是作者为什么需要自己造个轮子,可能作者觉得 libevent 封装得过于复杂实现的功能过多吧。这里区别一下Redis作者的 ae.c 和libevent的区别吧: libevent统一了三种事件的处理,IO事件、时间事件和信号事件,并且每个事件可以注册多个回调函数,事件之间具有优先级关系 (通过将就绪链表依据优先级设定为多条实现) 。而Redis仅仅统一了IO事件和事件事件,且一个事件fd只能注册一个回调函数,并且IO事件之间不具备优先级,按照epoll返回顺序依次执行。因此Redis的封装更加简单明了。 二者都是通过Reactor模式封装epoll了,所以实现起来,基本就是对一个大结构体操作。所以很容易实现。 再次发现,Redis的作者很喜欢造轮子。 实现 1、事件分发器及IO事件、定时事件结构体 通过三个结构体,直接看清楚这种Reactor模式实现起来多么容易。 时间事件通过单链表存储,内部存储距离1970年1月1日00:00:00的秒及微妙。每次时间事件是否需要处理就是通过获取当前时间,与存储的时间简单比较而已。因为先处理IO事件,所以加上处理IO事件的时间,就会导致时间事件的处理稍微推迟

【转载】编写简单的消息发布器和订阅器

我只是一个虾纸丫 提交于 2019-11-27 18:54:47
目录 1.功能包的创建 2.功能包的源代码编写 3.功能包的编译配置及编译 4.功能包的启动运行 通过上一节编写 ROS 的第一个程序 hello_world ,我们对 ROS 的整个编程开发过程有了基本的了解,现在我们就来编写真正意义上的使用 ROS 进行节点间通信的程序。由于之前已经建好了 catkin_ws 这样一个工作空间,以后开发的功能包都将放在这里面,这里给新建的功能包取名为 topic_example ,在这个功能包中分别编写两个节点程序 publish_node.cpp 和 subscribe_node.cpp ,发布节点( publish_node )向话题( chatter )发布 std_msgs::String 类型的消息,订阅节点( subscribe_node )从话题( chatter )订阅 std_msgs::String 类型的消息,这里消息传递的具体内容是一句问候语“ how are you ... ”,通信网络结构如图 16 。 ( 图 16 ) 消息发布与订阅 ROS 通信网络结构图 1.功能包的创建 在 catkin_ws/src/ 目录下新建功能包 topic_example ,并在创建时显式的指明依赖 roscpp 和 std_msgs 。打开命令行终端,输入命令: cd ~/catkin_ws/src/ #创建功能包topic

线程池和进程池

ぐ巨炮叔叔 提交于 2019-11-27 18:46:06
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import os import time ''' 进程池与线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' # pool = ThreadPoolExecutor() # 括号内可以传参数指定线程池内的线程个数 # 也可以不穿默认的是计算机cpu个数乘以5 pool = ProcessPoolExecutor() # 不传,默认参数为cpu个数 ''' 池子中创建的进程或者线程创建一次就不会再创建了 至始至终用的都是最初的几个 这样的话节省了反复开辟进程或者线程的资源 ''' def task(n): print(n, os.getpid()) time.sleep(2) return n**2, n def call_back(x): print(x) print('拿到了异步提交任务的返回结果:', x.result()) # if __name__ == '__main__': # pool.submit

《Windows程序设计》之计时器2

我怕爱的太早我们不能终老 提交于 2019-11-27 18:42:04
这是使用SetTimer的第二种方法-----回调函数 下面是几行关键的代码 VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD);//定义回调函数 SetTimer(hwnd,ID_TIMER,1000,TimerProc);//设置计时器,并调用回调函数 //回调函数实现 void CALLBACK TimerProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) { static BOOL fFlipFlop=FALSE; HBRUSH hBrush; HDC hdc; RECT rc; MessageBeep(-1); fFlipFlop=!fFlipFlop; GetClientRect(hwnd,&rc); hdc=GetDC(hwnd); hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(0,0,255)); FillRect(hdc,&rc,hBrush); ReleaseDC(hwnd,hdc); DeleteObject(hBrush); } 来源: CSDN 作者: l0g1n 链接: https://blog.csdn.net/l0g1n/article/details/7495577

摘要-The Inventor Mentor

我怕爱的太早我们不能终老 提交于 2019-11-27 16:26:29
第一章 综述 什么是Open Inventor 只要对象,不用绘制(Objects,not Drawings) 。多种方式使用数据对象 。动画 Open Inventor与OpenGL的关系 Inventor工具包 。场景数据库 。节点工具包 。操作器 Inventor组件库 Inventor类树 扩展工具包 -概述Open Inventor的基本概念和分类,讨论Inventor与OpenGL,Inventor与X窗口系统之间的关系。 -认识组成Open Inventor工具包的几个关键组件。 -理解Open Inventor与OpenGL的关系。 -描述扩展Open Inventor的几种方法。 -概要的阐述组成Open Inventor的几个关键组件,并将简要描述如何使用Open Inventor来完成一些特殊的需求。本章还将解释Inventor与我们可能已经很熟悉的编程工具,例如OpenGL和X Window System之间的关系。本章提及大多数的主题都将在以后的章节中作详细解释。 第二章 一个Inventor例子 Hello,Cone 。红色圆锥体 。使用引擎旋转圆锥 。增加上轨迹球操作器 。增加Examiner观察器 命名约定 场景基本类型(Scene Basic Types) Inventor使用的坐标系统 包含文件 -首先创建一个包含有圆锥的简单程序

回调函数我的理解

邮差的信 提交于 2019-11-27 15:44:29
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body></body><script> function fun(qwe){ console.log(0) console.log(qwe) qwe(function(zxc){ console.log(2) console.log(zxc) zxc() }) } fun(function(asd){ console.log(1) console.log(asd) asd(function(){ console.log(3) }) })//1、首先把//执行fun时输出0,把// function(asd){// console.log(1)// console.log(asd)// asd(function(){// console.log(3)// }// 为参数传给qwe;这样console.log(qwe)的结果就是上述函数。////2

Promise 对象

拥有回忆 提交于 2019-11-27 15:41:56
1.Promise 的含义 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。 Promise对象有以下两个特点: (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。 (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。 Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次

jQuery - 设置内容和属性

江枫思渺然 提交于 2019-11-27 15:12:41
设置内容 - text()、html() 以及 val() text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 通过 text()、html() 以及 val() 方法来设置内容: code: <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js"></script> <script> $(document).ready(function(){ $("#btn1").click(function(){ $("#test1").text("Hello world!"); }); $("#btn2").click(function(){ $("#test2").html("<b>Hello world!</b>"); }); $("#btn3").click(function(){ $("#test3").val("Dolly Duck"); }); }); </script> </head> <body> <p id="test1">这是段落。</p> <p id="test2">这是另一个段落。</p> <p>Input field: <input type="text" id="test3

AJAX 跨域请求

若如初见. 提交于 2019-11-27 14:36:55
原文地址: http://justcoding.iteye.com/blog/1366102 AJAX 跨域请求 - JSONP获取JSON数据 博客分类: Javascript /Jquery / Bootstrap / Web Asynchronous JavaScript and XML ( Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。 不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容

3、Vue实例的属性

大憨熊 提交于 2019-11-27 13:05:06
1、 获取 Vue 实例的属性 2、 data 属性 每个Vue 实例都会代理其 data 对象里所有的属性。如果实例创建之后添加或者更改属性,他不会触发视图更新。 这句话说了下面两件事情 1、 每个 Vue 实例都会代理其 data 对象里所有的属性 我们可以看出,app 这个 vue 实例已经代理了他里面 data 对象里的属性 2、 如果实例创建之后添加或者更改属性,他不会触发视图更新。 大家注意看,我们在vue 实例外面修改的 username 有效,在 vue 实例里面 ready 里面修改的 username 无效。 在 ready 方法里面修改 username 无效,已经说明了这句话 如果实例创建之后添加或者更改属性,他不会触发视图更新。 但是为什么在 vue 实例外面修改的 username 就有效了呢 ? 这是因为 JS 异步执行的问题,大家看,我们 new Vue 对象的时候,这个过程是需要时间的,为了不造成页面卡顿,创建 vue 对象时是异步执行的,所以会出现 正在创建 vue 对象时,后面的 app.username=" 我是猪 "; 也在执行,所以就把值改掉了。 也就是说,在 vue 实例创建之前,我们都可以在 data 中创建或修改属性值,但是一旦 vue 实例创建完成,创建和修改都不允许被操作。 3、 计算属性( computed )