最近我了解了网络编程。我知道对于服务器来处理多个客户端,需要使用select
或Thread
(至少在python / c / c ++中,我对{{1}类似的东西一无所知在java中,在java中我只知道线程方法)。
我已经读过,从性能的角度来看,使用select
更好,而小型服务器的线程更好。但是,昨天我发现了这个页面:http://www.assembleforce.com/2012-08/how-to-write-a-multi-threading-server-in-python.h我不明白为什么在提供的代码中我会同时使用select
和select
?我很难理解它是如何工作的,为什么它比我提到的其他方法更好?我不明白这段代码背后的想法。
谢谢。
答案 0 :(得分:1)
主题和select
不是互斥的。
多线程是一种并行处理形式,允许单个进程以异步方式看似执行多个任务。
使用select
允许程序监视文件描述符(例如套接字),等待事件。
两者都可以(而且据我所知,经常)一起使用。在网络服务器环境中,线程可用于为多个客户端提供服务,而使用select
时,其中一个线程不会占用CPU时间。
想象一下,您正在从多个客户端接收数据。一个线程正在等待来自client1的数据,这需要很长时间,同时,client2正在疯狂地发送数据。您有三种选择:
select
,使用阻止调用:阻止来自client1的等待数据,并让client2等待。select
,使用非阻止调用:连续轮询client1,在n
次尝试后放弃而不进行任何数据传输。select
:监控客户端套接字。如果他们有要传输的数据,请阅读它。否则,请重新调用当前线程的CPU时间。这是一种简单的非阻塞网络服务器方法,试图为客户端提供低延迟响应。有不同的方法,为此我建议你查看UNIX网络编程一书。