在多个核心中处理一个HTTP请求
Handle one HTTP request in multiple cores
我正在努力解决CPU核心流动的问题。
我在我的应用程序中有一些硬图数据收集逻辑,它基于许多相互关联的数据,目前是基于PHP 构建的
所以问题是基本上我的机器有多个CPU核心,但一个http请求在任何php模式下只占用一个CPU核心快速CGI、CGI。。。
所以我想知道在以下任何一种语言中是否有一些变通方法
PHP,NODEJS,JAVA,C++
这样您的一次执行将使用/涉及多个CPU核心
您需要使用多线程。例如,在PHP中,您需要从PECL:安装pthreads
> /<php-install-dir>/bin/pecl install pthreads
然后通过在php.ini.中添加.so扩展名来启用它
然后你可以运行这样的线程:
<?php
class MyThread extends Thread {
public function run() {
/* Your code here */
}
}
$thread1 = new MyThread();
$thread2 = new MyThread();
$thread1->start();
$thread2->start();
?>
它在所有编程语言中都非常相似。
基本上,单个传入请求将由大多数web框架上的单个线程管理
大多数web框架中的多线程支持
大多数框架将通过同时处理多个请求来利用机器的多个核心。如果您同时处理来自100个用户的100个请求,每个请求都将使用一个线程。。。如果你有4个核心,大约每个核心将使用你的硬件功能有效地管理25个线程。
在大多数情况下,让一个请求由多个线程处理是不必要的。
如果您的请求速度慢且CPU使用率高
当然,你可以使用多个线程来处理一个请求,但你必须确保这是值得的。通常,使用多线程算法会带来开销,这意味着你的网络服务器的全局吞吐量会降低。
这是在使一个占用大量CPU的慢速请求更快和总体吞吐量之间进行权衡。
web框架级别在多线程中绝对没有好处,因为基本上框架只关心接收和发送数据流,与给定的CPU速度相比,这是一个非常慢的操作。
如果您的实际算法确实受益于并行性,那么作为开发人员,您有责任实现该算法的多线程版本。
这会让你的程序变得更加复杂,更难推理。如果你的请求还不是很慢,比如几秒钟或更长时间,而且延迟主要来自计算,而不是等待DB或其他web服务,那么这可能是不值得的。
所以,在开始做一些过于复杂的事情之前,一定要确保你真的需要它
现代web框架采用相反的方法
事实上,相反的趋势恰恰相反。大多数http请求只是在等待外部资源,无论是来自DB的响应、另一个服务的响应还是将响应发送到网络接口。
因此,像javascript中的Node.js或java中的Vertex这样的现代框架采取了相反的方法。
给定的线程不会等待给定的请求完成。每当程序等待外部资源(DB、外部服务…(时,线程就会被释放,并处理其他操作,如管理其他请求。稍后,当响应可用时,将恢复请求处理。
事实证明,这可以提高Web服务器的总体吞吐量,至少在每次请求的CPU使用率不高但大部分时间都花在等待上的所有情况下是这样。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 在多个核心中处理一个HTTP请求
- VS2015 中卡萨布兰卡的链接器错误,同时尝试构建一个简单的 HTTP 侦听器
- 需要一个在C/C++或Python中进行HTTP/HTML网络编程的库
- 如何从HTTP在C++中打开一个URL不是文件位置的文件
- 可以创建一个单例 c++ 来进行身份验证并使用对 Facebook API 的 HTTP 请求在墙上发布
- 使用nodejs/http解析器创建一个web服务器
- 如何检查一个网站是http还是https,通过C/ c++代码使用CURLPP库
- 如何使用Mongoose(一个http服务器)来提供不同的请求
- 在黑莓10级联上创建一个HTTP通信