2017-10-15 98 views
0

我看了看周圍的可用線程池的紅寶石,如connection_pool它的工作原理是:紅寶石線程池

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) 

這將有效地在任何給定運行5個併發讀取操作時間。

但是我的使用案例涉及一個API,每秒調用5個調用的速率限制,所以沒有時間窗口相關性的常規併發限制對我無能爲力。

我該如何做到這一點?

+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 

我省略了細節,但我猜你得到的總體思路。