我正在用Python编写一个涉及套接字编程的应用程序。我已经理解,最好使用非阻塞套接字,从而编写一个事件驱动服务器。我不知道为什么和如何更喜欢使用这两种方法中的一种: select()和poll()来检查任何套接字中的活动。如果这些方法中有任何一种方法比另一种方法更好的选择,谁能帮我解决这个问题吗?
我的意思是,我为什么要选择一个而不是另一个?
发布于 2013-12-09 12:47:11
这取决于你想做什么。通常,我会使用select而不是投票,但这取决于。首先,选择并轮询阻塞套接字,让您在所有套接字中复用一个线程I/O。
其次,如果您想使用不需要使用select或轮询的非阻塞套接字,只需读取(recv)或写(发送),它就可以返回而不需要做任何事情。在C中,如果它将阻塞,操作将返回一个错误,告诉您它将阻塞(如果它是一个阻塞套接字)。
关于select和轮询之间的区别,两者都允许您使用多重IO,并允许您处理只有一个线程的多个套接字。但是民意测验让我们使用任何流设备。
此外,根据文档http://docs.python.org/2/library/select.html#poll-objects
投票比例更高,我不同意,因为选择和投票都有相同的时间复杂性,但文档显示是这样的。问题是,投票使用文件描述符列表,选择使用从0到要检查的最高文件描述符的位图。让我们来管理更多的事件,比如高优先级数据。对我来说,处理轮询比选择更复杂,因为在select中,您可以清楚地将准备写入的套接字与准备读取的套接字和那些有错误的套接字分开。
此外,您还可以查看几乎相同的C版本:http://manpages.courier-mta.org/htmlman2/poll.2.html
我希望这能帮到你。
发布于 2013-12-09 00:59:05
请注意,超时为0的select
基本上与投票相同,但跨系统编程的最大问题是,对select
和poll
的支持是混合的和不一致的--就我个人而言,我倾向于在一个单独的线程中选择一个阻塞侦听器,该线程一旦接收到完整的帧、消息等,就会引发带有数据的事件--这似乎可以很好地跨系统工作。
https://stackoverflow.com/questions/20466573
复制