sockets - poll() 是如何工作的,它与多线程有什么不同?
问题描述
我对操作系统和网络完全陌生。我找不到很好的资源(比如 Beejs 的指南)来掌握这些概念。我想制作一个可以处理多个连接的 TCP 服务器。poll() 允许我直接执行此操作(如 Beej 指南中所述)。那么为什么要做多线程和多处理呢?这三个有什么区别,什么时候用哪个?
PS:我对操作系统的经验很少。
解决方案
正如 Chris Dodd 总结的那样,“您可以使用适合您要解决的问题的任何技术”。但是为了给出一点上下文,我想引用一些一般考虑来选择多线程/进程方法。
当您不打算做任何事情时,您仍然有一个正在执行的线程,您正在执行轮询操作。该服务器可能具有低到中等流量,但假设您收到越来越多的请求,整个负载落在单个线程上,而有可能将工作卸载到空闲线程(cpu 上下文中的线程)。因此,这为多线程/进程方法开辟了道路。
通过创建一个新线程(在进程中),您正在创建一个与所有早期(创建)线程并行运行的新执行流。选择新线程优于进程的优点是所有线程共享相同的堆和全局内存,使线程间通信变得容易。粗略地说,当您只想运行相同的代码片段来服务所有客户端时,您想选择线程方法。
但是让我们假设您正在服务的每个请求都需要一起运行一个不同的程序,并且父进程和子进程之间没有复杂的通信,您最好创建一个新进程。
总而言之,您可能会遇到这样一种情况,即主进程进行池化并且它产生了几个子进程,而子进程创建了多个线程,因此一次使用了所有三个东西。所以选择最适合这个目的的东西。
推荐阅读
- r - 许多变量的相关矩阵(r 和 p 值)
- excel - 在 Excel 中使用两列突出显示重复项
- elasticsearch - 嵌套数据搜索
- sql - 解释 SQL 中 UNION 运算符的工作原理
- scala - 替换字符串中的模式(如果存在)
- javascript - 如何在全屏模式下显示 jquery ContextMenu?
- c++ - Writing a parser for formatted text in C++
- python - 对象权限函数多次触发
- django - How to send response to API consumer after finishing working of async task created with celery?
- continuous-integration - How can I run Fullstack E2E Tests in CI (Gitlab)