0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Eventloop的概念

Q4MP_gh_c472c21 来源:老吴嵌入式 作者:吴伟东Jack 2022-09-28 09:42 次阅读

最近了解了一下 Eventloop 这个概念,所以想写一篇文章整理一下思路。

1、Eventloop 是什么?

我在网上看了一些资料,但都比较复杂,而且大多和 JavaScript 扯上关系,对初学者不友好。

我个人理解的 Eventloop,其实就是在一个大循环里,处理各种各样的事件。只是不同的 Eventloop 机制或者库,在性能和适用场景之间有差别罢了。

一个程序,只要它需要一直工作,就会处于一个持续循环运行的状态,我把这个循环的状态,称为 Eventloop。

举个简单的例子:

intmain()
{
intchoice;

do{
//等待用户输入
choice=getch();

switch(choice){
case'q':
break;

case'a':
add_record();
break;
[...]
}
}while(choice!='q');

exit(EXIT_SUCCESS);

}

上面这个程序,在一个 while 循环里,根据不同的键盘输入事件,而执行不同的操作。

这就是一个简单的 Eventloop,只是这个 Eventloop 只处理一种事件:键盘输入,且是阻塞等待,虽然很简陋,但是对于上面这个场景而言,已经够用了。

Eventloop 随处可见:

许多开源软件,只要它们有持续运行 + 事件处理的需求,就会有自己的 Eventloop 实现,例如:

图形库 Qt 里的 QGuiApplication::run();

多媒体库 SDL2 里的 SDL_PollEvent();

网络库 Mongoose 里的 mg_mgr_poll();

本质上都是一种 Eventloop,只是由于需求和应用场景的不一样,各自的实现方法有所差异。

合格的 Eventloop:

一个合格的 Eventloop,需要有哪些特性?

我个人认为:

1、不要阻塞,即不要调用可能会阻塞的系统调用,或总是以 nonblocking 的方式调用系统调用。

2、能异步处理事件。

3、性能尽量高,以满足业务需求为下限。

满足上述三点,这个 Eventloop 在功能上就是够用的。

2、Eventloop 怎么用?

基于 select 的 Eventloop:

这是来自 UNIX 网络编程 16.2 章节的一个例子,其大致代码如下:

str_cli(FILE*fp,intsockfd)
{
...

//setnonblock
val=Fcntl(sockfd,F_GETFL,0);
Fcntl(sockfd,F_SETFL,val|O_NONBLOCK);

//eventloop
for(;;){
...
Select(maxfdp1,&rset,&wset,NULL,NULL);

if(FD_ISSET(sockfd,&rset)){
//dosomething
}

...//otherevent
}
}

这个程序会从标准输入中读取一行数据,然后通过 socket 发送给服务端,然后接收服务端的响应,最后将响应也写到标准输出。

最关键的点是先调用 fcntl 将所有的输入输出都设置为 nonblock,然后用 select 监测所有的文件描述符。

基本上所有的开源事件库,本质上和这个程序没差别。

各种开源的 Eventloop 库:

由于 Eventloop 是一个比较通用的需求,在开源软件里,有许多优秀的异步事件库都实现了这个功能。

比较适合嵌入式领域异步事件库有 3 个:

libevent:an event notification library.

名气最大,应用最广泛,历史最悠久的跨平台事件库。

libev:a high performance full-featured event loop written in C.

较 libevent 而言,设计更简练,但是对 Windows 支持不够好,并且和开源社区不怎么接轨。

libuv:a multi-platform support library with a focus on asynchronous I/O.

6cbdc1f6-3e1d-11ed-9e49-dac502259ad0.jpg

点击查看大图

开发 node.js 的过程中需要一个跨平台的事件库,目前非常活跃,推荐大家重点学习。

libev 最精简,入门最容易,这里用它来介绍一下事件库的用法:

#include
#include

//定义两个事件watcher
ev_iostdin_watcher;
ev_timertimeout_watcher;

//iowatcher的回调函数
staticvoid
stdin_cb(EV_P_ev_io*w,intrevents)
{
puts("stdinready");
ev_io_stop(EV_A_w);
ev_break(EV_A_EVBREAK_ALL);
}

//timerwatcher的回调函数
staticvoid
timeout_cb(EV_P_ev_timer*w,intrevents)
{
puts("timeout");
ev_break(EV_A_EVBREAK_ONE);
}

intmain(void)
{
//定义eventloop
structev_loop*loop=EV_DEFAULT;

//初始化iowatcher
ev_io_init(&stdin_watcher,stdin_cb,/*STDIN_FILENO*/0,EV_READ);
ev_io_start(loop,&stdin_watcher);

//初始化timerwatcher
ev_timer_init(&timeout_watcher,timeout_cb,2,0.);
ev_timer_start(loop,&timeout_watcher);

//启动eventloop
ev_run(loop,0);
return0;
}

libev 用 watcher 来检测各种事件,当事件发生时,会调用 watcher 的回调函数。

那么,具体支持哪些事件类型呢?

6d124a14-3e1d-11ed-9e49-dac502259ad0.png

如果你对 libev 感兴趣,可以根据下面这张图阅读其源码:

6d573a34-3e1d-11ed-9e49-dac502259ad0.png6d8a6c2e-3e1d-11ed-9e49-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源
    +关注

    关注

    3

    文章

    2962

    浏览量

    41604
  • javascript
    +关注

    关注

    0

    文章

    507

    浏览量

    53379

原文标题:不懂就问:什么是Eventloop?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    新手必看,关于ARM的22个常用概念

    文章具体介绍了关于ARM的22个常用概念。。##ARM体系结构的存储器格式
    发表于 08-28 18:57 6119次阅读

    关于ARM的22个常用概念--的确经典

    关于ARM的22个常用概念--的确经典
    发表于 08-20 14:00

    关于数字电路的基本概念和学习内容

    关于数字电路的基本概念和学习内容初学硬件电子电路设计的你知道数字电路的基本概念吗?知道数字电路都学什么内容吗?其实,电子电路硬件设计电路主要分为模电和数电两部分,模电主要是关于电路分析
    发表于 07-22 16:46

    关于智能住宅若干概念

    关于智能住宅若干概念.doc
    发表于 09-10 13:35

    关于传输流以及传输流中几个重要概念

    MPEG-2标准简介以及数字电视功能分析关于传输流以及传输流中几个重要概念信道解复用器是什么原理?
    发表于 04-21 06:53

    关于单片机的代码和概念学习

    (需具有C语言基础)关于单片机的组件基础,请另行学习,本文章只针对代码和概念进行学习,并不牵扯各个部件的连接步骤。首先看如下代码:int val;//定义变量valint ledpin=13
    发表于 01-18 10:25

    关于虚拟HLR的概念,华为是否支持

    关于虚拟HLR的概念,华为是否支持 一个操作员可以对一定号段的用户进行操作,互相之间不可见,不能干扰。这个一定的号段往往可以对
    发表于 06-30 09:47 632次阅读

    关于计算机虚拟现实技术在概念设计中的实现

    关于计算机虚拟现实技术在概念设计中的实现  目前国际上流行的一种“故事版情景预言法”的概念设计,就是将要开发的产品置于一定的人、时、地、事和物中进行
    发表于 01-16 16:49 911次阅读

    关于单片机的一些基本概念

    关于单片机的一些基本概念  随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相
    发表于 03-18 16:54 1029次阅读

    石墨稀_石墨稀概念

    本内容讲解了什么是石墨稀,石墨稀概念是什么,关于石墨稀处理器等系列的知识方便大家认识石墨稀
    发表于 04-28 16:03 5671次阅读

    关于智能住宅若干概念

    关于智能住宅若干概念
    发表于 08-07 10:09 0次下载

    关于锁存器的time borrowing概念

    静态时序分析经常会遇到基于锁存器(latch)的设计从而引入了一个概念称为“Time Borrowing”。这篇文章向大家解释了什么是time borrowing,以及锁存器(latch)设计和时序
    发表于 10-02 07:54 751次阅读

    关于电池的元素和概念介绍

    视频简介:视频主讲关于电池的基础关于电池的元素和概念。主要介绍了燃油测量技术,阐述了关机电压、放电率、温度和电池年龄的内在关系。
    的头像 发表于 03-27 06:01 3926次阅读
    <b class='flag-5'>关于</b>电池的元素和<b class='flag-5'>概念</b>介绍

    ISO 26262中关于失效的概念

    嗨,大家好!今天打算给大家分享一下ISO 26262中关于失效的概念,这也是功能安全所围绕的核心问题。
    的头像 发表于 09-22 10:30 6257次阅读

    RT-Thread全球技术大会:关于瑞萨“e-AI”概念的训练和开发流程

    RT-Thread全球技术大会:关于瑞萨“e-AI”概念的训练和开发流程         审核编辑:彭静  
    的头像 发表于 05-27 10:30 903次阅读
    RT-Thread全球技术大会:<b class='flag-5'>关于</b>瑞萨“e-AI”<b class='flag-5'>概念</b>的训练和开发流程