C语言 使用 curl 轻松切换多个线程到使用 curl multi 的单线程



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

我不清楚的事情:

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

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

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

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

(这实际上是伪装成一个问题的几个问题,不太适合堆栈溢出。

curl_multi_perform()不会阻止。它现在尽可能多地做,然后返回并期望程序在需要时间或其中一个套接字上有活动时再次调用它。

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

在任何给定时刻,在多个线程中使用相同的 libcurl 句柄是不行的。如果您确实需要从多个线程使用相同的句柄,则需要谨慎地进行互斥。请参阅库卷曲踩踏手册页。通常最好将内容从其他线程放入 qeueus 中,并让单个使用 libcurl 的线程尽可能从该队列中读取句柄或操作,从而确保单个线程访问句柄。

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

最新更新