2017-10-15 28 views
0

私は同じように動作しconnection_poolようなルビーために利用可能なスレッドプールの周りに見てきた:これは事実のみ任意で5つの同時フェッチ操作を実行しますRubyのスレッドプール

pool = ConnectionPool.new(size: 5, timeout: 20) do 
    @user 
end 

results = ['foo', 'bar', 'a', 'z'].map do |thing| 
    Thread.new do 
    pool.with do |user| 
     user.fetch(thing) 
    end 
    end 
end.map(&:join).map(&:value) 

時間。

私の使用例では、1秒あたり5コールのレート制限を課すAPIが含まれているため、時間ウィンドウの相関がない通常の同時の制限は役に立ちません。

どうすればよいですか?

+0

操作を高速化するために接続プールを使用します。故意に遅くする必要がある場合は、組み込みのレートリミッタまたはバックオフ間隔の再試行メカニズムを使用して順次キューが必要です。 – tadman

答えて

2

共通問題を回避するには、適切な量のスリープ状態にある:

# Schedule threads 
threads = something.map { |foo| Thread.new... } 
# Record time now 
start_time = Time.now 
# Wait for threads to finish 
threads.each(&:join) 
# Record elapsed time 
elapsed_time = Time.now - start_time 
# Calculate necessary wait time 
sleep_time = thread_count * REQUEST_DELAY - elapsed_time 
# Sleep if necessary 
sleep sleep_time if sleep_time > 0 

私は詳細を省略したが、私は、あなたが一般的なアイデアを得ると思います。

関連する問題