哪个效率更高:在多线程程序中是curl_easy_perform()还是在单线程程序中是curl_multi_perform()?

时间:2018-09-25 05:22:22

标签: multithreading c++11 url libcurl

我正在开发一个程序,需要从不同的URL下载大量JSON文件。

当前,我的程序创建了多个线程,并且在每个线程中,它调用LibCurl easy_perform()函数,但我遇到了程序偶尔失败且错误为“ double free”的问题。 。似乎是某种Heisenbug,但我已经能够在GDB中将其捕获,这确认了错误源自LibCurl(回溯)。

虽然我希望就遇到的问题提出建议,但我的实际问题是:如果我更改代码结构以在一个线程上使用LibCurl Multi Interface而不是调用单个接口会更好些吗?跨多个线程?在一个之上使用一个之上的权衡是什么?

注意:“更好”是指它更快,对CPU的负担更少?多接口是为此设计的吗?

编辑:

据我了解,我有以下三个选择:

1)在单个线程中重复使用相同的easy_handle。无需重新建立连接即可使其更快。

2)在每个单独的线程中调用curl_easy_perform()。它们再次并行运行,从而使其更快。

3)在单个线程中调用curl_multi_perform()。这是非阻塞的,所以我想所有文件都是并行下载的,这样可以更快?

以下哪个选项最省时?

1 个答案:

答案 0 :(得分:1)

curl_easy_perform正在阻止操作。这意味着,如果您在一个线程中运行,则必须顺序下载文件。在多线程应用程序中,您可以并行运行许多操作-这通常意味着更快的下载时间(如果速度不受网络或目标服务器的限制)。

但是,如果您想采用单线程方式,则有一个非阻塞变体可能更适合您-curl_multi_perform

从卷曲的人

  

您可以在使用的同时调用curl_easy_perform   一样的easy_handle。如果您打算传输多个文件,则您   甚至被鼓励这样做。然后,libcurl将尝试重用   后续传输使用相同的连接,因此   操作更快,CPU占用更少,使用的网络资源也更少。   请注意,您必须在两个之间使用curl_easy_setopt   调用以设置以下curl_easy_perform的选项。

简而言之-与curl_easy_perform相比,它没有什么好处。