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

问题描述:

Twisted具有“非阻塞”事件循环。非阻塞事件循环如何工作?

我明白什么是阻塞事件循环(从维基百科页面排序),但无法弄清楚非阻塞事件是如何做的。

+0

这与我前段时间回答的另一个问题类似:http://stackoverflow.com/questions/80617/asychronous-programming-in-python-twisted/81456#81456 – Glyph 2010-06-25 18:03:36

while (true) 
    wait_for_events 
    handle_events 

基本上,非阻塞事件循环利用设备,其允许等待同时多个事件(select/poll上UNIX,WaitForMultipleEvents在Windows,epoll在Linux kqueue在FreeBSD等等)。在主循环的每次迭代中,事件(文件描述符,定时器等)都在某种句柄中注册。然后,调用等待事件的函数(例如,select)。这通常会返回在调用该函数期间发生的所有事件。最后,循环处理事件 - 通常通过调用与事件相关的回调。

有关详细信息,请参阅libevent或某些GUI工具包事件循环的实现 - GTK +或Qt。

+0

只是出于好奇,如何系统处理'select()',我的意思是它作为一个线程分叉?或过程?如果它不是线程或分叉作为一个进程,我无法将自己的头围绕如何进行非阻塞... – chutsu 2012-08-13 17:58:30