2016-09-29 7 views
0

1時間あたりのAPI呼び出し数を制限するWebサイトへのAPI呼び出しを数多く作成します。時には100k +通話回数を作るため、必要なすべてのデータを取得するのに数時間かかることがあります。私は、APIコールが1時間あたりの最大数を超えているかどうかをチェックするループを構築したいと思います。また、超過した場合は、開始時と終了時の時間差を確認してください。何かがAPI呼び出し数と時間間隔に関するループ

startTime = Now() 

For i = 1 To 150000 
    If counter <= 36000 Then 
     url = baseURL + Str(i) + "?apikey=" + apiKey 
     resp.Open "GET", url 
     resp.Send 

     ' Process the response 

     counter = counter + 1 
    Else # More than 36,000 API calls have been made 
     Do 
      # Nothing in the loop, just waiting for 60 minutes to pass 
     While DateDiff(n, startTime, Now()) < 60 

     startTime = Now() 
     i = i - 1 # Need to re-loop on the current i 
    End If 
Next i 

ように私はまだそれをテストする機会がなかったが、それがうまくいくように紙の上に見えますが、また、ハックの仕事のように見えます(特にそのI = I - 1)。私がやろうとしていることをする良い方法はありますか?

答えて

2

更新:Cominternが指摘したように私はIのカウンタを逃した。

カウンタが36000のマークに達するたびに、1時間が経過したかどうかを確認します。私が開始時刻をリセットし、それ以外の場合は、開始時刻から1時間後に再び実行するようにマクロをスケジュールします。

Sub MakeAPICalls(Optional Counter As Long = 150000) 

    Dim Start: Start = Timer 
    Dim count As Long 

    For I = Counter To 150000 

     count = count + 1 

     URL = baseURL + Str(I) + "?apikey=" + apiKey 
     resp.Open "GET", URL 
     resp.Send 

     ' Process the response 
     ' Exit Do if complete 

     If (count Mod 36000) = 0 Then 
      If (Timer - Start) < 3600 Then 
       Start = Timer 
      Else 
       Application.OnTime Now + (3600 - (Timer - Start)), "MakeAPICalls " & I 
       Exit Sub 
      End If 
     End If 
    Next 

End Sub 
+0

'OnTime'呼び出しと似ていますが、' count'は静的ではありませんか? – Comintern

+0

カウンタがリセットされるのは、時間が経過するまでサブが再度呼び出されないためです。静的にする必要のある部分はOPのコードです。私はいつ彼がすべてのデータを収集したかを伝える方法がありません。オペレータは、マクロを複数回実行することで依然として望ましい結果が得られるように、コードを構造化する必要があります。 –

+0

意味があります。 OPにはURLに 'Str([loopcounter])'が組み込まれています。私はちょうど 'カウント 'を再利用する方が簡単だと思っていました。 – Comintern

1

2つのネストループを使用してこれを簡略化します。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

このごプロセッサISN」を確認します。

Dim requests As Long 
For i = 1 To 150000 Step 36000 
    If i > 144000 Then requests = 5999 Else requests = 35999 
    For x = 0 To requests 
     URL = baseURL + Str(i + x) + "?apikey=" + apiKey 
     resp.Open "GET", URL 
     resp.Send 
     ' Process the response 
    Next 
    Sleep 3600000 '1 hour 
Next 

注これはSleep API呼び出しを使用しています。そして、あなたの36K要求を行うために内部ループを使用して、あなたの要求数によって外側のループをステップ何もしないループで1時間100%釘付けにした。 Excelが反応し続けるようにするには(Sleepが文字通り実行中のスレッドを一時停止する)、NOPループ内にDoEventsを置くことができますが、CPUサイクルの無駄になります。

+1

わかりました。私はあなたの最後の声明を読んでいません。私は 'Sleep 1000:DoEvents'がうまくいくと思う。 「スリープ3600000」は、おそらく36Kコールに要した時間を考慮して調整する必要があります(36Kコールを処理するのに59分かかる場合、1分間マクロを休止する必要があります)。 –

関連する問題