多线程 curl 同时处理多个连接

Posted

技术标签:

【中文标题】多线程 curl 同时处理多个连接【英文标题】:Multi threaded curl handling multiple connections at the same time 【发布时间】:2017-06-24 17:38:22 【问题描述】:

curl_multi 接口是否在内部产生新线程以同时处理多个请求?是否等于手动生成线程并仅使用 curl_easy 句柄?什么性能更高。我需要最多并发 1000 个请求。

https://curl.haxx.se/libcurl/c/multithread.html

是否使用 curl_multi 等于上面链接中的示例?

发件人:https://curl.haxx.se/libcurl/c/libcurl-multi.html

在同一线程中启用多个同时传输,而不会使应用程序变得复杂。

这是什么意思?它如何处理同一线程中的多个传输?我也可以用 100 个 curl_easy 句柄创建 100 个线程并在那里发出请求。

也许问题应该是:何时使用多线程,何时使用 curl_multi。

【问题讨论】:

"curl_multi 接口是否在内部生成新线程以同时处理多个请求?" 不。正如文档(由您自己引用)所说:“启用多个同时传输在同一个线程中". 至于如何:文档链接到curl.haxx.se/libcurl/c/curl_multi_perform.html,其中显示了使用select 的示例。还有curl.haxx.se/libcurl/c/curl_multi_socket_action.html,看起来像是epoll/kqueue/whatever的接口。 C 还是 C++?它们是不同的语言。选择一个。 @tambre 他们没有什么不同,问题是关于 libcurl 的,所以没关系,它适用于两者。 @tambre libcurl 是 C API。 【参考方案1】:

没有简单或简单的答案。 libcurl 允许您和您的应用程序做出决定并支持在任一模式下工作。

libcurl 多接口是一种单核单线程方式,可以在同一个线程中进行大量并行传输。它允许轻松重用缓存、连接等。这有其明显的优势,但会使其在单个 CPU 中受 CPU 限制。

进行多线程传输将使每个线程/句柄都有自己的缓存和连接池等,这些会在它们有用时发生变化,但是当您可以将它们分散到各个位置时,它们将不太可能受 CPU 限制一组更大的内核/CPU。

哪个设计决定适合您,我们很难说。

【讨论】:

【参考方案2】:

单个 curl_multi 句柄上的所有连接都不会在同一个线程上运行。它使用单个 select/poll/epoll 事件循环和非阻塞套接字在同一个线程上同时处理所有连接。

【讨论】:

以上是关于多线程 curl 同时处理多个连接的主要内容,如果未能解决你的问题,请参考以下文章

PHP多线程处理问题

多线程

curl模拟多线程抓取网页(优化)

为啥服务器在非多线程的情况下会同时处理多个客户端?

使用curl实现多线程

多线程是啥