回调函数

elect、poll、epoll优缺点

僤鯓⒐⒋嵵緔 提交于 2019-12-31 11:04:51
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 ,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 select的几大缺点: (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 (3)select支持的文件描述符数量太小了,默认是1024 2 poll实现   poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。 select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。但是解决了select的文件描述符的最大上线数 3、epoll   epoll既然是对select和poll的改进,就应该能避免上述的三个缺点。那epoll都是怎么解决的呢?在此之前

C++ MFC在子对话框中操作三菱PLC

喜夏-厌秋 提交于 2019-12-30 19:09:43
前面有一篇文章讲过C++和三菱plc的通讯: https://blog.csdn.net/V_Gogol/article/details/103389983 ,本文是其拓展。 背景 前面讲过在工程中添加Activex控件,并使用控件创建变量,此对象包含了PLC的多个操作函数。但是在实际项目中遇到了一个问题,就是只能在主对话框放入activex控件,相当于这个对象的作用域仅限于主对话框对应的头文件和源文件,如果要在其他类中对PLC进行操作(例如设置或读取指定端口的值)就会显得比较麻烦。本文讲的是编写一个专门的PLC操作类包含回调函数来实现其他类里也可以方便的对plc进行操作。 实现 直接贴代码: 这个类是为了方便复用和全局范围操作plc编写的,声明了几个回调函数,下面主要讲设置端口值和读取端口值的封装操作。 下面是回调函数,在主对话框初始化函数中注册,就能够实现plc类里进行设置和读取操作时自动执行主对话框中实际的plc操作相关代码 这个是设置和读取端口值函数 以上是声明,下面才是函数实现: 设置和读取差不多,下面以设置值为例对代码进行详细讲解 这个函数在主对话框调用,注册回调函数,相当于通知主对话框,只要调用CFXPlc这个类中的设置端口值函数,就会自动执行主对话框的的对应函数。 ////回调--设置指定端口值 BOOL CFXPlc::C_SetPortValue(BOOL

Scrapy框架

扶醉桌前 提交于 2019-12-30 14:30:04
一、介绍 二、安装 三、命令行工具 四、项目结构以及爬虫应用简介 五、Spiders 六、Selectors 七、Items 八、Item Pipelin 九、 Dowloader Middeware 十、Sider Middlewear 十一、自定义扩展 十二、setitings.py 十三、获取亚马逊商品信息 一、介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 Scrapy 是基于twisted框架开发而来 ,twisted是一个流行的事件驱动的python网络框架。 因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发 。整体架构大致如下 在Scrapy的数据流是由执行引擎控制,具体流程如下: 1、spiders产生request请求,将请求交给引擎 2、引擎(EGINE)吧刚刚处理好的请求交给了调度器,以一个队列或者堆栈的形式吧这些请求保存起来,调度一个出来再传给引擎 3、调度器(SCHEDULER)返回给引擎一个要爬取的url 4

Android Fragment和Activity

℡╲_俬逩灬. 提交于 2019-12-30 14:04:16
Fragment和Activity Fragment和Activity的交互   一个Fragment的实例总是和包含它的Activity直接相关。   fragment可以通过 getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById()之类的方法。   如:    View listView = getActivity() . findViewById (R.id.list);    但是注意调用getActivity()时,fragment必须和activity关联(attached to an activity),否则将会返回一个null。   相似的,activity也可以获得一个fragment的引用,从而调用fragment中的方法。   获得fragment的引用要用 FragmentManager ,之后可以调用 findFragmentById() 或者 findFragmentByTag() .   比如:    ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 创建事件回调    一些情况下,可能需要fragment和activity共享事件

epoll、多线程模型

我怕爱的太早我们不能终老 提交于 2019-12-29 14:50:12
如何切换epoll event_loop.c 文件的 event_loop_init_with_name 函数是关键,通过宏 EPOLL_ENABLE 来决定是使用 epoll 还是 poll 的。 struct event_loop * event_loop_init_with_name ( char * thread_name ) { . . . # ifdef EPOLL_ENABLE yolanda_msgx ( "set epoll as dispatcher, %s" , eventLoop -> thread_name ) ; eventLoop -> eventDispatcher = & epoll_dispatcher ; # else yolanda_msgx ( "set poll as dispatcher, %s" , eventLoop -> thread_name ) ; eventLoop -> eventDispatcher = & poll_dispatcher ; # endif eventLoop -> event_dispatcher_data = eventLoop -> eventDispatcher -> init ( eventLoop ) ; . . . } 根目录下的 CMakeLists.txt 文件里,引入

JS-线程、事件循环、任务队列

风流意气都作罢 提交于 2019-12-29 02:42:59
JS 是单线程的,但是却能执行异步任务,这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue)。 事件循环: JS 会创建一个类似于 while (true) 的循环,每执行一次循环体的过程称之为 Tick。每次 Tick 的过程就是查看是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中由主线程执行。待处理的事件会存储在一个任务队列中,也就是每次 Tick 会查看任务队列中是否有需要执行的任务。 任务队列: 异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的 3 种 webAPI,分别是 DOM Binding、network、timer 模块。 onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任务队列中。 setTimeout 会由浏览器内核的 timer 模块来进行延时处理,当时间到达的时候,才会将回调函数添加到任务队列中。 ajax 则会由浏览器内核的 network 模块来处理,在网络请求完成返回之后,才将回调添加到任务队列中。 主线程 JS 只有一个线程,称之为主线程

JS 单线程

。_饼干妹妹 提交于 2019-12-29 02:42:27
js单线程阻塞实例 setTimeout(function () { while (true) { } }, 1000); setTimeout(function () { alert('end 2'); }, 2000); setTimeout(function () { alert('end 1'); }, 100); alert('end'); 结果是弹出’end’、’end 1’,然后浏览器假死,就是不弹出‘end 2’。 js单线程重点: JS 是单线程的,但是却能执行异步任务, 这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue)。 事件循环: JS 会创建一个类似于 while (true) 的循环, 每执行一次循环体的过程称之为 Tick。 每次 Tick 的过程就是查看是否有待处理事件, 如果有则取出相关事件及回调函数放入执行栈中由主线程执行。 待处理的事件会存储在一个任务队列中, 也就是每次 Tick 会查看任务队列中是否有需要执行的任务。 任务队列: 异步操作会将相关回调添加到任务队列中。 而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同, 这些异步操作是由浏览器内核的 webcore 来执行的。 onclick 由浏览器内核的 DOM Binding

JavaScript 运行机制详解

妖精的绣舞 提交于 2019-12-29 02:42:10
一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。 JavaScript语言的设计者意识到

浅谈javascript的运行机制

牧云@^-^@ 提交于 2019-12-29 02:41:52
  积累一下这几天学的,记录一下: 一、为什么JavaScript是单线程?   JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列   单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行

Javascript运行机制

ε祈祈猫儿з 提交于 2019-12-29 02:41:27
一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。 JavaScript语言的设计者意识到