【问题标题】:General explanation of how epoll works?epoll如何工作的一般解释?
【发布时间】:2012-12-12 17:48:51
【问题描述】:

我正在写一篇关于从数据库轮询(通过同步存储过程调用)切换到消息队列(通过发布/订阅)的技术文章。我希望能够解释轮询数据库与建立与 AMQP 代理的连接和配置消息处理程序相比有何巨大不同和重得多。

有人可以在这里提供解释,或者指出一个很好的高级教程,说明当通知套接字上有新数据可用时,epoll 如何工作?

【问题讨论】:

  • 你看过http://en.wikipedia.org/wiki/Epoll,或者http://www.kernel.org/doc/man-pages/online/pages/man4/epoll.4.html,这两个都有一般的解释吗?另外,我不确定如何解释 epoll 将有助于解释您正在讨论的差异。你可以在数据库文件上epoll 一个inotify,或者你可以epoll 消息系统下的队列,那么……你的目标是什么?
  • 抱歉,我的问题发布得太早了,是错误的。我已经更新了它。这能说明问题吗?

标签: python rabbitmq file-descriptor epoll


【解决方案1】:

我假设“epoll 的工作原理”是指从用户的角度来看它是如何工作的(例如,你的代码如何得到通知,以及应该如何处理它),而不是内核的观点(如 epoll 是如何实现的)。

简短的版本很简单:就像poll,除了两点:

  1. 它使用不透明数据结构的句柄,因此您不会在内核边界来回传递太多数据。
  2. 它具有poll 所没有的选项(尤其是边缘触发和一次性通知),可以让您在某些情况下编写更高效的代码。

(还有一个事实是它只能在 linux 上运行。BSD 和相关系统有 kqueue,这是获得相同优势的一种截然不同的方式,Solaris 有 /dev/poll 等,一些 *nixes 有没有等价物。所以如果你想编写可移植的代码,你要么必须使用poll,要么使用一些更高级别的库,如libevent,或者自己编写libevent的等价物。)

如果您已经了解selectpoll,则在其参考文献中链接的the Wikipedia articlethe blog post 应该在它们之间告诉您几乎所有您需要知道的内容,而man page 将填写任何差距。

如果没有,请先了解poll,然后才能了解epoll 的不同之处。

我仍然不确定这与您的主要问题有何关系。您可以在数据库文件上使用epollinotify,或者在消息传递系统下使用pipesocket,或者在Linux 中可以表示为文件描述符的任何其他内容,所以我不确定理解epoll 将如何帮助您解释轮询数据库与轮询消息队列之间的区别。两者之间当然有很大的不同,但事件触发机制不是其中之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2017-08-08
    • 2021-10-24
    相关资源
    最近更新 更多