c++ - 在 C++ 中使用 cURL 和多线程

标签 c++ python-3.x curl python-requests httprequest

我有一个 POST 请求,我想在没有任何时间偏移的情况下重复它。我已经用 requests 完成了在 python .

import requests
import json

url = 'SOME URL'
headers = {"headers"}
payload ={"some payload here"}
data = json.dumps(payload)
session = requests.Session()

def SendOrder():
    r = session.post(url,data=data,headers=headers)
    print(r.text)

for i in range(2000):
    Thread(target=SendOrder,args=[]).start()

它完美地工作,每个线程在发送帖子请求后自行结束。我用 C++ 实现了 cURL :
int Requst(CURL *curl) {

    curl_easy_perform(curl);
    double tt = 0.000;
    int curlRC = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &tt);
    printf("%.8lf\n", tt);
    return 0;

}
    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();
        curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
        curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
        chunk = curl_slist_append(chunk, "user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36");
        chunk = curl_slist_append(chunk, "x-requested-with:XMLHttpRequest");
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        std::string jsonstr = "PAYLOAD";
        curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 2L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonstr.c_str());
        curl_easy_setopt(curl, CURLOPT_URL, "url");
        for (int i = 1; i <= 1000; i++) {
            std::thread(Requst, curl);
        }
        curl_easy_cleanup(curl);
        curl_global_cleanup();

我想在制作 Request 后自行结束线程称呼。我不太了解 C++。
或者无论如何要制作类似python代码的东西?
谢谢

最佳答案

std::thread只是围绕 native (实际)线程的包装类。您应该保留 std::thread周围的实例和join()在它被销毁之前使用它,否则std::thread的析构函数将中止程序。

您还应该调用 curl_easy_*线程内部。

像这样的东西

std::vector<std::thread> threads;
for (int i = 1; i <= 1000; i++) {
   threads.emplace_back([&]{ // creates and starts a thread
       CURL *curl = curl_easy_init();
       curl_easy_setopt(...
       . . .
       curl_easy_perform();
       curl_easy_cleanup(curl);
   });
}
for (auto& t : threads) { // wait for all threads to finish
    t.join();
}

话虽如此,为了获得良好的性能,最好使用 curl multi API .它使用异步套接字而不是线程。

以下是一些如何使用 curl 多 API 的示例:multi-poll.c10-at-a-time.c

关于c++ - 在 C++ 中使用 cURL 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60416770/

相关文章:

python - python3中的importlib.util是什么?

bash - 使用 curl 循环访问 url 的 Shell 脚本

c++ - 使用mergesort c++计算 vector 中的反转

c++ - 在 C++ 中使用星号绘制数字

Python ctypes - 类型错误 : int expected instead of float

mysql - 接口(interface)错误: 2013: Lost connection to MySQL server during query

php - 当 session Cookie 过期时使用 cURL

phpcurl 获取代理

c++ - CUDA block 级并行原语

c++ - 当你通过引用返回对象时,你什么时候需要担心对象会被销毁?