【问题标题】:Sockets - select / thread / both套接字 - 选择/线程/两者
【发布时间】:2022-02-17 00:25:03
【问题描述】:

最近我学习了网络编程。我知道服务器要处理多个客户端,需要使用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?我很难理解它究竟是如何工作的,为什么它比我提到的其他方法更好?我不明白这段代码背后的想法。

谢谢。

【问题讨论】:

  • 如何使用串行总线、RabbitMQ、MuleSoft。让串行总线为您完成工作。使您的应用程序线程安全可能非常复杂,通常最好让操作系统为您处理。可能无法回答问题,但这些是不同的渠道,适用于 Web 开发。

标签: multithreading sockets select


【解决方案1】:

线程和select 不是互斥的。

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

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

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

假设您正在接收来自多个客户端的数据。一个线程正在等待来自client1的数据,耗时太长,同时client2正在疯狂发送数据。您有三个选择:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多