【发布时间】:2022-01-06 20:43:48
【问题描述】:
目前,我正在为 curl 轻松处理创建一个池,以发出并行 HTTP 请求。但这是阻塞的。
这是我的实现:
class CurlHttpClient
{
public:
...
private:
CURL* m_curl = nullptr;
std::mutex m_mtx;
std::stack<CURL*> m_poolCurlHandle;
CURL* getCurlHandleFromPool();
void pushCurlHandle(CURL* curlHandle);
};
CURL* CurlHttpClient::getCurlHandleFromPool()
{
CURL* pCurlHandle = nullptr;
std::scoped_lock lock(m_mtx);
{
if (!m_poolCurlHandle.empty())
{
pCurlHandle = m_poolCurlHandle.top();
m_poolCurlHandle.pop();
}
return pCurlHandle;
}
return curl_easy_duphandle(m_curl);
}
void CurlHttpClient::pushCurlHandle(CURL* curlHandle)
{
std::scoped_lock lock(m_mtx);
m_poolCurlHandle.push(curlHandle);
}
int CurlHttpClient::request(const std::string& requestUrl, std::string& responseBuffer)
{
CURL* curlHandle = getCurlHandleFromPool();
curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, (void*)&responseBuffer);
curl_easy_setopt(curlHandle, CURLOPT_URL, requestUrl.c_str());
CURLcode res = curl_easy_perform(curlHandle);
int httpResponseCode = 0;
curl_easy_getinfo(curlHandle, CURLINFO_RESPONSE_CODE, &httpResponseCode);
pushCurlHandle(curlHandle);
return httpResponseCode;
}
// Example Client
int main()
{
CurlHttpClient client;
...
std::thread t1([&] { std::string response; std::string url; client.request(url, response); //do something with response});
std::thread t2([&] { std::string response; std::string url; client.request(url, response); //do something with response});
std::thread t3([&] { std::string response; std::string url; client.request(url, response); //do something with response});
std::thread t4([&] { std::string response; std::string url; client.request(url, response); //do something with response});
t1.join();
t2.join();
t3.join();
t4.join();
}
您可以在此处看到,我会在收到每个请求后立即单独返回响应。
我读到 curl 多接口在处理并行请求方面效果更好。我已经看到了一些多接口设置的示例,所有示例都在累积请求并触发多执行。但是我不确定如何在收到单个响应时立即将数据返回给客户端并继续等待另一个响应到达。
多接口在我的特定场景中是否有用?如果是这样,我如何在收到个人回复后立即返回?
【问题讨论】:
-
多接口在单线程中工作,而不是多线程。设计模式非常不同。
-
也许你可以看看这个问题,它可能也有你的答案:stackoverflow.com/questions/44739178/…
-
是的,我看过那些多接口示例,但它并没有回答我关于如何立即获得个人响应的问题
标签: c++ multithreading libcurl