簡體   English   中英

cURL,是curl_multi_init多線程還是異步API?

[英]cURL, is curl_multi_init multithreaded or is it an async API?

我的問題很簡單,cURL的curl_multi_init實際上是多線程還是只使用異步API? 謝謝!

cURL是一個非常古老的庫, 真正的異步代碼是一個相對較新的概念。 libcurl是用C語言編寫的,因此每個請求都是阻塞的。 雖然您可以並行處理多個請求,但這對於您的程序來說絕對不是異步的,因為您必須等到最長的請求完成:

while((curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

也就是說,我仍然相信cURL是最好的解決方案。 實現此功能的其他庫通常也使用curl,它們只是添加回調,以便在每個單獨的請求完成后立即處理數據,而不是等待它們全部然后達到100%CPU以在最后處理所有內容。

問題是curl_multi的大多數實現在處理它們之前等待每組請求完成。 如果一次請求處理的請求太多,它們通常會分組,然后一次處理一個。 這個問題是每個組都必須等待最慢的下載請求。 在一組100個請求中,只需要一個緩慢的延遲處理99個其他請求。 您處理的請求數越多,此延遲就越明顯。

解決方案是在每個請求完成后立即處理。 這消除了繁忙等待時浪費的CPU周期。 我還創建了一個cURL請求隊列,以允許最大吞吐量。 每次請求完成后,從隊列中添加一個新請求。 通過動態添加和刪除鏈接,我們始終保持一定數量的鏈接下載。 這為我們提供了一種方法來限制我們發送的同時請求的數量。 結果是以更快和更有效的方式並行處理大量cURL請求。

RollingCurlX Rolling Curl X是Rolling Curl包裝器cURL Multi的一個分支。 它旨在使PHP中的並發http請求盡可能簡單。
RollingCurl for PHP (未在5年內更新)

http://php.net/manual/en/function.curl-multi-init.php

允許異步處理多個cURL句柄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM