2015-04-23 56 views
2

我在飛鏢運行命令行模式時遇到了一個有趣的問題 - 它太快了!飛鏢限制同步連接

情況是,代碼必須訪問網站並檢索可下載文件的列表,然後下載每個文件以寫入本地磁盤。

問題是,每個下載操作都異步運行,並且下載開始失敗,出現錯誤,如'SocketException:OS錯誤:信號量超時期已過。'和「收到完整標題前關閉連接」。至於我可以確定我的電腦上的操作系統無法打開所有必需的連接,或者可能Web服務器已被淹沒。

我應該如何更改設計來限制同時連接的數量?

回答

0

除此之外什麼建議岡特Zöchbauer,我可以告訴下面的選項(輕量級軟件信號量):

import 'dart:async'; 

import 'package:semaphore/semaphore.dart'; 

Future main() async { 
    var maxCount = 3; 
    var running = 0; 
    var simultaneous = 0; 
    var sm = new LocalSemaphore(maxCount); 
    var tasks = <Future>[]; 
    for (var i = 0; i < 9; i++) { 
    tasks.add(new Future(() async { 
     try { 
     await sm.acquire(); 
     running++; 
     if (simultaneous < running) { 
      simultaneous = running; 
     } 

     print("Start $i, running $running"); 
     await _doWork(100); 
     running--; 
     print("End $i, running $running"); 
     } finally { 
     sm.release(); 
     } 
    })); 
    } 

    await Future.wait(tasks); 
    print("Max permits: $maxCount, max simultaneous runned: $simultaneous"); 
} 

Future _doWork(int ms) { 
    // Simulate work 
    return new Future.delayed(new Duration(milliseconds: ms)); 
} 

輸出:

Start 0, running 1 
Start 1, running 2 
Start 2, running 3 
End 0, running 2 
Start 3, running 3 
End 1, running 2 
Start 4, running 3 
End 2, running 2 
Start 5, running 3 
End 3, running 2 
Start 6, running 3 
End 4, running 2 
Start 7, running 3 
End 5, running 2 
Start 8, running 3 
End 6, running 2 
End 7, running 1 
End 8, running 0 
Max permits: 3, max simultaneous runned: 3