使用 curl 将多个线程轻松切换为使用 curl multi 的单线程

Pav*_*l P 0 c libcurl

我使用libcurl 简单界面,并在我的 C++ 应用程序中创建了许多线程来处理这些 http 请求。我想将代码转换为使用libcurl multi。从概念上讲,这个想法很清楚:我不会在来自多个线程的每个 curl 简单句柄上调用阻塞curl_easy_perform而是从单个线程调用阻塞curl_multi_perform,这个调用将在内部处理所有附加的 curl 简单句柄。

我不清楚的事情:

  • 如何取消阻塞 curl_multi_perform 调用(来自另一个线程)正在处理的任何未完成的 http 请求。同样,如果使用简单的界面进行相同的工作,我可以结束/关于来自另一个线程的 http 请求,而另一个线程在该句柄上执行 curl_easy_perform。

  • 当另一个线程在多句柄上调用 curl_multi_perform 时,可以向多句柄添加新的简单句柄吗?

  • 如果我在加载数据时使用curl_multi_remove_handle中止一个传出的 http 请求(假设它正在下载 1GB 文件),那么我可以在此之后立即重用相同的句柄。curl 是否关闭了在中间中止的 tcp 连接?否则,如果不完全下载整个 1GB 主体,我就看不到如何重用该连接。

是否有一个简单的示例用于从不同的线程执行多个简单的请求,并将相同的示例转换为多接口?

Dan*_*erg 5

(这确实是几个问题伪装成一个,不太适合stackoverflow。)

curl_multi_perform()不阻塞。它现在做的尽可能多,然后它返回并期望程序在时间到了或者它的一个套接字上有活动时再次调用它。

理想情况下,您可以在其他线程中标记要停止的传输,一旦curl_multi_perform()返回,您就可以从多句柄中删除所述简单句柄,并且它们不再存在于游戏中。或者,您可以使用单个传输的回调(写入/读取/进度)在您希望传输结束时返回错误。

在任何给定时刻在多个线程中使用相同的 libcurl 句柄是不行的。如果你真的需要从多个线程使用同一个句柄,那么你需要做仔细的互斥。请参阅libcurl 踩踏手册页。通常最好将其他线程的东西放入队列中,并让使用 libcurl 的单个线程在可能的情况下从该队列读取句柄或操作,然后确保单线程访问句柄。

如果您通过使用 移除句柄curl_multi_remove_handle()来中止传输,则该传输将中止。停了。您确实可以立即重用该句柄,如果您将其放回原处,它将被视为全新的传输,除非您更改简单句柄中的任何选项,否则它只会使用相同的 URL 从头开始​​。过早中止的传输当然会得到正确处理,这可能包括必要时关闭 TCP 连接。