非阻塞事件循环是如何工作的?

3
Twisted拥有一个“非阻塞”事件循环。我了解什么是阻塞事件循环(从维基百科页面上了解到一些),但无法弄清楚非阻塞事件循环是如何工作的。

这与我一段时间前回答的另一个问题类似:https://dev59.com/NXVD5IYBdhLWcg3wHn2d#81456 - Glyph
1个回答

3
while (true)
    wait_for_events
    handle_events

基本上,非阻塞事件循环利用设备,允许同时等待多个事件(在UNIX上使用select/poll,在Windows上使用WaitForMultipleEvents,在Linux上使用epoll,在FreeBSD上使用kqueue等)。在主循环的每次迭代中,事件(文件描述符、定时器等)都会被注册在某种句柄中。然后,调用等待事件的函数(例如select)。这通常返回在调用该函数期间发生的所有事件。最后,循环处理这些事件 - 通常是通过调用与事件相关联的回调函数来处理。
要了解更多信息,请查看libevent或一些GUI工具包事件循环的实现 - GTK+或Qt。

只是出于好奇,系统如何处理select()呢?我的意思是它是作为线程被分叉吗?还是作为进程?如果没有作为线程或进程被分叉,我就无法理解它如何成为非阻塞的。 - chutsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接