套接字 - 选择/线程/两者

时间:2017-04-11 19:06:14

标签: multithreading sockets select

最近我了解了网络编程。我知道对于服务器来处理多个客户端,需要使用selectThread(至少在python / c / c ++中,我对{{1}类似的东西一无所知在java中,在java中我只知道线程方法)。

我已经读过,从性能的角度来看,使用select更好,而小型服务器的线程更好。但是,昨天我发现了这个页面:http://www.assembleforce.com/2012-08/how-to-write-a-multi-threading-server-in-python.h我不明白为什么在提供的代码中我会同时使用selectselect?我很难理解它是如何工作的,为什么它比我提到的其他方法更好?我不明白这段代码背后的想法。

谢谢。

1 个答案:

答案 0 :(得分:1)

主题和select不是互斥的。

多线程是一种并行处理形式,允许单个进程以异步方式看似执行多个任务。

使用select允许程序监视文件描述符(例如套接字),等待事件。

两者都可以(而且据我所知,经常)一起使用。在网络服务器环境中,线程可用于为多个客户端提供服务,而使用select时,其中一个线程不会占用CPU时间。

想象一下,您正在从多个客户端接收数据。一个线程正在等待来自client1的数据,这需要很长时间,同时,client2正在疯狂地发送数据。您有三种选择:

  1. 没有select,使用阻止调用:阻止来自client1的等待数据,并让client2等待。
  2. 使用select,使用非阻止调用:连续轮询client1,在n次尝试后放弃而不进行任何数据传输。
  3. 使用select:监控客户端套接字。如果他们有要传输的数据,请阅读它。否则,请重新调用当前线程的CPU时间。
  4. 这是一种简单的非阻塞网络服务器方法,试图为客户端提供低延迟响应。有不同的方法,为此我建议你查看UNIX网络编程一书。