如何在Python中的select模块中的select.select()和select.poll()方法之间进行选择



我正在用Python编写一个涉及套接字编程的应用程序。我已经明白,最好使用非阻塞套接字,从而编写一个事件驱动的服务器。我不确定为什么以及如何更喜欢我想要使用的这两个方法之一:select()和poll(),用于检查任何套接字中的活动。如果这两种方法中有任何一种比另一种更好的选择,有人能帮我吗?

我的意思是,为什么我会选择一个而不是另一个?

这取决于你想做什么。通常我会使用select而不是poll,但这取决于情况。首先,选择并轮询阻塞套接字,并允许在所有套接字之间多路复用线程I/O。

其次,如果你想使用非阻塞套接字,你不需要使用select或poll,你只需读取(recv)或写入(send),它就可以在不做任何事情的情况下返回。在C中,如果它会阻塞,操作将返回一个错误,告诉您它会阻塞(如果它是阻塞套接字)。

关于select和poll之间的区别,两者都允许复用IO,并允许您仅用一个线程处理多个套接字。但poll让您可以使用任何STREAMS设备。

此外,根据文件http://docs.python.org/2/library/select.html#poll-对象

poll的规模更好,我不同意,因为select和poll的时间复杂度相同,但文档说明了这一点。问题是poll使用文件描述符列表,select使用位图,从0到您要检查的最高文件描述符。poll让您可以管理更高数量的事件,如高优先级数据。对我来说,轮询比选择更难处理,因为在选择中,您可以清楚地将准备写入的套接字与准备读取的套接字和有错误的套接字区分开来。

此外,你还可以看看C版本,它们的作用几乎相同:http://manpages.courier-mta.org/htmlman2/poll.2.html

我希望这能有所帮助。

请注意,超时为0的select基本上与轮询相同,但跨系统编程的最大问题是对selectpoll的支持是混合和不一致的——就我个人而言,我倾向于在单独的线程中选择阻塞侦听器,一旦完成帧、消息等。,收到后引发了一个附带数据的事件——这似乎在跨系统中运行良好。

最新更新