我正在开发一个程序,需要从不同的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()。这是非阻塞的,所以我想所有文件都是并行下载的,这样可以更快?
以下哪个选项最省时?
答案 0 :(得分:1)
curl_easy_perform正在阻止操作。这意味着,如果您在一个线程中运行,则必须顺序下载文件。在多线程应用程序中,您可以并行运行许多操作-这通常意味着更快的下载时间(如果速度不受网络或目标服务器的限制)。
但是,如果您想采用单线程方式,则有一个非阻塞变体可能更适合您-curl_multi_perform
从卷曲的人
您可以在使用的同时调用curl_easy_perform 一样的easy_handle。如果您打算传输多个文件,则您 甚至被鼓励这样做。然后,libcurl将尝试重用 后续传输使用相同的连接,因此 操作更快,CPU占用更少,使用的网络资源也更少。 请注意,您必须在两个之间使用curl_easy_setopt 调用以设置以下curl_easy_perform的选项。
简而言之-与curl_easy_perform相比,它没有什么好处。