2017-04-11 33 views
0

最近我已经了解了网络编程。我知道,对于服务器来处理多个客户端,有需要使用selectThread(至少在python/c/C++中,我不知道什么关于在java中类似于select的东西,在java中我只知道线程方法)。套接字 - 选择/线程/都

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

谢谢。

+0

如何使用串行总线RabbitMQ MuleSoft。让串行总线为你做好工作。让您的应用程序线程安全可能相当复杂,通常让OS更好地为您处理。可能不会回答问题,但这些是不同的出路,适用于Web开发。 –

回答

1

线程和select不是互斥的。

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

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

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

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

  1. 没有select,使用阻塞调用:阻止来自client1的等待数据,并且让client2等待。
  2. select,使用非阻塞调用:连续轮询client1,放弃n尝试没有任何数据传输。
  3. With select:监控客户端套接字。如果他们有数据要传输,请阅读它。否则,请重新确定当前的线程CPU时间。

这是一种简单的非阻塞网络服务器方法,试图给客户端提供低延迟响应。有不同的方法,为此,我建议您检查UNIX网络编程书。

+0

使用你的建议,我试图用线程和select来实现一个服务器。但似乎有些事情仍然是错误的。能否请你帮忙? http://stackoverflow.com/questions/43355800/select-thread-multiclient-server-in-python-hangs-after-receiving-after-first-m –