【问题标题】:LibCurl parallel http request in a multi threaded environment多线程环境中的 LibCurl 并行 http 请求
【发布时间】: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


【解决方案1】:

对于如何监控给定句柄的进度的问题,最好的方法是使用附加到相应句柄的回调函数来检查并响应作业的进度:

https://everything.curl.dev/libcurl/callbacks/progress

您可以通过使用选项 CURLOPT_XFERINFOFUNCTION 调用 curl_easy_setopt 来附加回调。

作业结束没有回调,但 CURLOPT_XFERINFOFUNCTION 将在作业完成后很快被调用,因此除非您有非常大腿的实时限制,否则它将完成这项工作。

【讨论】:

  • 使用多接口时,curl_multi_info_read() 函数将返回有关每个单独的句柄/传输何时完成的信息
  • 我认为多接口在这种特殊情况下并不理想。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2022-08-08
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多