CURL 多執行緒問題

2021-06-18 13:30:49 字數 954 閱讀 9510

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 多執行緒抓取

php curl 多執行緒抓取 curl 多執行緒 param array array 並行 param int timeout 超時時間 防止死迴圈耗死cpu 這段是根據網上的寫法 do while mrc curlm call multi perform 當正在接受資料時 while activ...

CURL多執行緒抓取網頁

網上這類方法似乎太多了。但是總是有一些問題存在。對於多執行緒抓取,現在有如下幾種思路 1.用apache的多執行緒特性,讓php進行 多程序 操作,就像post本身一樣 2.用curl的curl multi庫 對於第一種,我還沒嘗試,因為這種製造的是偽多執行緒,也許效率會低很多,而且不好控制。第二種...

curl多執行緒抓取資料

curl模擬多執行緒,傳入一維陣列url curl模擬多執行緒 access public author 2017.4 param array return array function getcurlobject urls array responses array 聲名乙個陣列 dowhile ...