最大並發數
URLSessionConfiguration
里有個httpMaximumConnectionsPerHost
的屬性,它的作用是控制同一個host同時連接的數量,蘋果的文檔顯示,默認在macOS里是6,在iOS里是4。單從字面上來看它的效果應該是:如果設置為N,則同一個host最多有N個任務並發下載,其他任務在等待,而不同host的任務不受這個值影響。但是實際上又有很多需要注意的地方。
- 沒有資料顯示它的最大值是多少,經測試,設置為1000000都沒有問題,但是如果設置為Int.Max,則會出問題,對於大多數URL都是無法下載(應該跟目標url的服務器有關);如果設置為小於1,對於大多數URL都無法下載
- 當使用
URLSessionConfiguration.default
來創建一個URLSession
時,無論在真機還是模擬器上httpMaximumConnectionsPerHost
設置為10000,無論是否同一個host,都可以有多個任務(測試過180多個)並發下載httpMaximumConnectionsPerHost
設置為1,對於同一個host只能同時有一個任務在下載,不同host可以有多個任務並發下載
- 當使用
URLSessionConfiguration.background(withIdentifier:)
來創建一個支持后台下載的URLSession
- 在模擬器上
httpMaximumConnectionsPerHost
設置為10000,無論是否同一個host,都可以有多個任務(測試過180多個)並發下載httpMaximumConnectionsPerHost
設置為1,對於同一個host只能同時有一個任務在下載,不同host可以有多個任務並發下載
- 在真機上
httpMaximumConnectionsPerHost
設置為10000,無論是否同一個host,並發下載的任務數都有限制(目前最大是6)httpMaximumConnectionsPerHost
設置為1,對於同一個host只能同時有一個任務在下載,不同host並發下載的任務數有限制(目前最大是6)- 即使使用多個
URLSession
開啟下載,可以並發下載的任務數量也不會增加 - 以下是部分系統並發數的限制
- iOS 9 iPhone SE上是3
- iOS 10.3.3 iPhone 5上是3
- iOS 11.2.5 iPhone 7Plus上是6
- iOS 12.1.2 iPhone 6s上是6
- iOS 12.2 iPhone XS Max上是6
- 在模擬器上
從以上幾點可以得出結論,由於支持后台下載的URLSession
的特性,系統會限制並發任務的數量,以減少性能的開銷。同時對於不同的host,就算httpMaximumConnectionsPerHost
設置為1,也會有多個任務並發下載,所以不能使用httpMaximumConnectionsPerHost
來控制下載任務的並發數。Tiercel 2是通過判斷正在下載的任務數從而進行並發的控制。
http://www.cocoachina.com/articles/27216