CURL 多线程问题
来源:互联网 发布:软件功能模块图 编辑:程序博客网 时间:2024/05/16 23:37
CURL 多线程问题
默认情况下libcurl完成一个任务以后,出于重用连接的考虑不会马上关闭
如果没有新的TCP请求来重用这个连接,那么只能等到CLOSE_WAIT超时,这个时间默认在7200秒甚至更高,太多的CLOSE_WAIT连接会导致性能问题
解决方法:
curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);
最好再修改一下TCP参数调低CLOSE_WAIT和TIME_WAIT的超时时间
2. libcurl 有个很好的特性,它甚至可以控制域名解析的超时。但是在默认情况下,它是使用alarm + siglongjmp 实现的。用alarm在多线程下做超时,本身就几乎不可能。如果只是使用alarm,并不会导致程序崩溃,但是,再加上siglongjmp,就要命了 (程序崩溃的很可怕,core中几乎看不出有用信息),因为其需要一个sigjmp_buf型的全局变量,多线程修改它。(通常情况下,可以每个线程一个 sigjmp_buf 型的变量,这种情况下,多线程中使用 siglongjmp 是没有问题的,但是libcurl只有一个全局变量,所有的线程都会用)。
具体是类似 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L) 的超时设置,导致alarm的使用(估计发生在域名解析阶段),如前所述,这在多线程中是不行的。解决方式是禁用掉alarm这种超时, curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L)。
这样,多线程中使用超时就安全了。但是域名解析就没了超时机制,碰到很慢的域名解析,也很麻烦。文档的建议是 Consider building libcurl with c-ares support to enable asynchronous DNS lookups, which enables nice timeouts for name resolves without signals. c-ares 是异步的 DNS 解决方案。
- CURL 多线程问题
- CURL多线程处理需要注意问题
- 多线程中使用curl致coredump问题
- curl 多线程在android下无故退出的问题
- CURL多线程抓取网页
- curl多线程实例
- Curl 多线程类
- 多线程的cURL
- php curl 多线程抓取
- curl多线程注意事项
- curl多线程下载实现
- Curl多线程|CurlMulti
- curl多线程采集
- curl多线程采集----评论
- curl类多线程采集
- curl多线程抓取数据
- php curl 多线程
- php中curl的多线程
- CF#202DIV2: A. Cinema Line
- 沉默3年了,该写点什么呢——什么是网络通讯?(续)
- CF#202DIV2:B. Color the Fence
- C++库研究笔记——赋值操作符operator=的正确重载方式(2)
- CloneGraph
- CURL 多线程问题
- Java Thread 总结
- 判断当前网络是否存在
- 利用Object的wait、notify来实现线程同步原理,Thread t1 = new Thread(new Runnable() {
- 在C语言中使用位带操作
- ASI POST上传图片
- 判断网络是否连接正常
- getifaddrs()和struct ifaddrs的使用,获取本机IP
- 获取的是开机后WIFI,3G/GPRS网络下使用流量