使用 curl easy 将多个线程切换为使用 curl multi 的单线程
Switching many threads using curl easy to single thread using curl multi
我在单个线程中使用 libcurl easy interface and I create lots of threads in my c++ app to handle these http requests. I would like to convert the code to use libcurl multi instead. Conceptually, the idea is clear: instead of calling blocking curl_easy_perform on each curl easy handle from multiple threads I'll call a blocking curl_multi_perform,这个内部调用将处理所有附加的 curl easy handles。
我不清楚的事情:
如何取消阻塞 curl_multi_perform 调用(来自另一个线程)正在处理的任何未完成的 http 请求。类似地,同样可以使用简单的界面,我可以 end/about 来自另一个线程的 http 请求,而另一个线程在该句柄上执行 curl_easy_perform。
在多手柄上有另一个线程调用curl_multi_perform时,可以向多手柄添加新的简易手柄吗?
如果我在加载数据时使用 curl_multi_remove_handle 中止其中一个传出的 http 请求(假设它正在下载 1GB 的文件),那么我可以在之后立即重用相同的句柄. curl 是否关闭在中间中止的 tcp 连接?否则,如果不完全下载整个 1GB 正文,我看不出如何重用该连接。
是否有用于从不同线程执行多个简单请求并将同一个示例转换为多接口的简单示例?
(这真的是几个问题伪装成一个问题,不太适合Whosebug。)
curl_multi_perform()
不阻塞。它现在会尽其所能,然后它 returns 并期望程序在它的时间或它的套接字之一上有 activity 时再次调用它。
理想情况下,您可以标记哪些传输在其他线程中停止,一旦 curl_multi_perform()
returns 您可以从多句柄中删除所述简单句柄,它们不再在游戏。或者,当您希望传输结束时,您可以使用单个传输的回调 (write/read/progress) 到 return 错误。
不可以在任何给定时刻在多个线程中使用相同的 libcurl 句柄。如果您确实需要从多个线程使用同一个句柄,那么您需要小心进行互斥。参见libcurl treading man page。通常最好从其他线程将内容放入 qeueus,并让单个使用 libcurl 的线程在可能的情况下从该队列读取句柄或操作,然后确保单线程访问句柄。
如果您通过使用 curl_multi_remove_handle()
删除句柄来中止传输,则该传输将中止。停了。您确实可以立即重复使用该手柄,如果您将其放回原处,它将被视为全新的传输,除非您更改简单手柄中的任何选项,否则它将以相同的方式从头开始再次 URL.过早中止的传输当然会得到正确处理,这可能包括在必要时关闭 TCP 连接。
我在单个线程中使用 libcurl easy interface and I create lots of threads in my c++ app to handle these http requests. I would like to convert the code to use libcurl multi instead. Conceptually, the idea is clear: instead of calling blocking curl_easy_perform on each curl easy handle from multiple threads I'll call a blocking curl_multi_perform,这个内部调用将处理所有附加的 curl easy handles。
我不清楚的事情:
如何取消阻塞 curl_multi_perform 调用(来自另一个线程)正在处理的任何未完成的 http 请求。类似地,同样可以使用简单的界面,我可以 end/about 来自另一个线程的 http 请求,而另一个线程在该句柄上执行 curl_easy_perform。
在多手柄上有另一个线程调用curl_multi_perform时,可以向多手柄添加新的简易手柄吗?
如果我在加载数据时使用 curl_multi_remove_handle 中止其中一个传出的 http 请求(假设它正在下载 1GB 的文件),那么我可以在之后立即重用相同的句柄. curl 是否关闭在中间中止的 tcp 连接?否则,如果不完全下载整个 1GB 正文,我看不出如何重用该连接。
是否有用于从不同线程执行多个简单请求并将同一个示例转换为多接口的简单示例?
(这真的是几个问题伪装成一个问题,不太适合Whosebug。)
curl_multi_perform()
不阻塞。它现在会尽其所能,然后它 returns 并期望程序在它的时间或它的套接字之一上有 activity 时再次调用它。
理想情况下,您可以标记哪些传输在其他线程中停止,一旦 curl_multi_perform()
returns 您可以从多句柄中删除所述简单句柄,它们不再在游戏。或者,当您希望传输结束时,您可以使用单个传输的回调 (write/read/progress) 到 return 错误。
不可以在任何给定时刻在多个线程中使用相同的 libcurl 句柄。如果您确实需要从多个线程使用同一个句柄,那么您需要小心进行互斥。参见libcurl treading man page。通常最好从其他线程将内容放入 qeueus,并让单个使用 libcurl 的线程在可能的情况下从该队列读取句柄或操作,然后确保单线程访问句柄。
如果您通过使用 curl_multi_remove_handle()
删除句柄来中止传输,则该传输将中止。停了。您确实可以立即重复使用该手柄,如果您将其放回原处,它将被视为全新的传输,除非您更改简单手柄中的任何选项,否则它将以相同的方式从头开始再次 URL.过早中止的传输当然会得到正确处理,这可能包括在必要时关闭 TCP 连接。