- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这两个库都是为异步 I/O 调度而设计的,并且都在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue 等。
除了表面上的差异,我的意思是这两个库之间真正的差异是什么?关于架构,还是设计理念?
最佳答案
就设计理念而言,libev 的创建是为了改进 libevent 中的一些架构决策,例如,全局变量的使用使得在多线程环境中安全使用 libevent 变得困难,观察者结构很大,因为它们结合了 I/O,时间和信号处理程序合二为一,额外的组件(例如 http 和 dns 服务器)遭受了糟糕的实现质量和由此产生的安全问题,并且计时器不精确并且不能很好地应对时间跳跃。
Libev 试图改进其中的每一个,不使用全局变量,而是对所有函数使用循环上下文,对每种事件类型使用小型观察程序(I/O 观察程序在 x86_64 上使用 56 个字节,而 libevent 则使用 136 个字节) ,允许额外的事件类型,例如基于挂钟与单调时间的计时器、线程间中断、准备和检查观察者以嵌入其他事件循环或被嵌入等等。
额外的组件问题通过根本没有它们来“解决”,因此 libev 可以小而高效,但您还需要在其他地方寻找 http 库,因为 libev 根本没有(例如,有一个非常相关的库,称为 libeio,它可以执行异步 I/O,它可以独立使用,也可以与 libev 一起使用,因此您可以混合搭配)。
简而言之,libev 尝试只做一件事(POSIX 事件库),并且以最有效的方式进行。 Libevent 试图为您提供完整的解决方案(事件库、非阻塞 I/O 库、http 服务器、DNS 客户端)。
或者,更短地说,libev 尝试遵循 UNIX 工具箱哲学,即只做一件事,尽可能好。
请注意,这是设计理念,我可以权威地陈述它,因为我设计了 libev。这些设计目标是否真正达到,或者其理念是否基于合理的原则,都由您来判断。
2017 年更新:
我多次被问到我所指的计时器不精确是什么,以及为什么 libev 不支持 Windows 上的 IOCP。
对于计时器,libevent 会根据 future 某个未知的基准时间来安排计时器,而您却浑然不知。 Libev 可以提前告诉你它将使用什么基准时间来调度定时器,这使得程序可以同时使用 libevent 方法和 libev 方法。此外,libevent 有时会提前使计时器过期,具体取决于后端。前者是一个 API 问题,后者是可以修复的(并且可能已经修复了 - 我没有检查)。
至于 IOCP 支持 - 我认为无法做到,因为 IOCP 根本不够强大。一方面,它们需要一种特殊的套接字类型,这将进一步限制 Windows 上允许的句柄集(例如,perl 使用的 sopcket 是 IOCP 的“错误”类型)。此外,IOCP 根本不支持 I/O 就绪事件,它们只能执行实际的 I/O。对于某些句柄类型,有一些解决方法,例如执行虚拟 0 字节读取,但同样,这将进一步限制您可以在 Windows 上使用的句柄类型,而且将依赖于可能不被所有套接字提供程序共享的未记录的行为.
据我所知,没有其他事件库支持 Windows 上的 IOCP。 libevent 的作用是,除了事件库之外,它还允许您对读/写操作进行排队,然后可以通过 IOCP 完成这些操作。由于 libev 不为您执行 I/O,因此无法在 libev 本身中使用 IOCP。
这确实是设计使然 - libev 试图变得小并且类似于 POSIX,而 Windows 根本没有有效的方法来获取 POSIX 风格的 I/O 事件。如果 IOCP 很重要,您要么必须自己使用它们,要么使用许多其他为您执行 I/O 的框架,因此可以使用 IOCP。
关于libevent - libev 和 libevent 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433864/
这两个库都是为异步 I/O 调度而设计的,并且都在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue 等。 除了表面上的差异,我的意思是这两个库之间真正的差异是什么?关于架构,
假设我有 2 个正在监视事件的套接字,我真的希望套接字 1 成为首选(即使以耗尽套接字 2 为代价)。我如何用 libev 做到这一点(我问了关于 libuv 的同样问题 here 但看起来 libu
我想使用事件驱动库之一制作基本的聊天服务器。但是选择什么? libevent 或 libev 哪个更好?哪个有更好的 C++ 支持?哪个 rune 在 Windows 中更好?什么更快?更快地开发和理
我正在尝试监控一个 unix 套接字(“/tmp/mysocket”)。 我可以在 Node.js 中很好地做到这一点:当 1) 套接字被绑定(bind),2) 有人连接到套接字,3) 数据被发送到套
我正在尝试向后移植基于 libevent 的库以使用 ASIO 后端(从而避免在单个应用程序中出现多个事件循环)。还有其他方法可以解决“问题”,但我对这个感兴趣 我在 Boost::ASIO 文档中没
我目前正在使用libevent编写多线程应用程序。 某些事件是由IO触发的,但我需要使用event_active()由代码本身跨线程触发的几个事件。 我试图编写一个简单的程序来显示我的问题所在: 使用
我花了一些时间在互联网上搜索寻找更好的方法来分析和调试我的问题,但我似乎找不到解决方案。所以我想我会问。 简要地。我正在尝试创建一个非阻塞 ssl 转发代理。代理的服务器部分使用自签名服务器证书,我使
我有以下代码: #include #include #include #include #include void fd_cb(int fd,short event,void *arg){
我有几个关于 libevent2 及其多线程支持的问题。 libevent 是否支持多线程? 我想实现的是这样的: 在单个线程中创建一个 event_base。 在这个单线程中设置事件并将它们关联到事
我正在遵循this示例。 Line#37表示工作线程数应等于cpu核心数。为什么? 如果有1万个连接,而我的系统有8个核心,这是否意味着8个辅助线程将处理1万个连接?为什么我不应该增加这个数字? 最佳
我正在学习如何使用 Libevent。虽然我无法理解 pending 和 active 之间的区别。在我看来,当一个事件被添加到 event_base 并且事件还没有发生时,它就处于 pending
我想知道是否有关于如何编译 libev-dev 的说明在 Linux (CentOS) 64 位上。我找不到与 libev 相关的开发包,也找不到任何有关其编译的教程。p.s:请不要使用包管理器 -
我想知道是否有关于如何编译 libev-dev 的说明在 Linux (CentOS) 64 位上。我找不到与 libev 相关的开发包,也找不到任何有关其编译的教程。p.s:请不要使用包管理器 -
我正在学习 libev 并且偶然发现了这个问题。假设我想尽快处理某些事情,但不是现在(即不在当前执行函数中)。例如,我想将一些大型同步作业分成多个部分,这些部分将排队,以便其他回调可以在两者之间触发。
我有干净的centos6系统,尝试从源代码编译tor。第一种方式(通过 yum 安装 libevent)。我愿意: yum install libevent2 yum install libevent
我在代码中有结构指针 struct evkeyvalq *headers; 现在我调用一个函数,该函数将在结构中填充一些信息。 evhttp_parse_query(uri, headers) 我在这
Rant:我真的不喜欢 boost::asio,所以我一直在寻找替代方案并遇到了 libev。这对我来说似乎很简单,但正在做一些我无法理解的事情。如果一个线程中的问题太多,请告诉我。 1) 我将监听套
如果我们主要想要一个基于 epoll 的文件描述符循环,那么 libevent 还提供什么功能(对 http 或dns 东西)?? 我知道这是一个很大的项目,但对我来说编写一个 epoll 包装器 A
我在我的 Linux 'c' 应用程序中将 libev 用于计时器和 io 事件,我想将自定义数据与事件相关联。在 libev 文档中,它暗示了 associating custom data但没有给
在 C 中使用 libev 创建小型网络服务器时,在不阻塞 react 器的情况下提供文件服务(打开、就绪、写入套接字)的最佳策略是什么? 我有一些建议一次阅读几个区 block ,但我不确定这是正确
我是一名优秀的程序员,十分优秀!