我正在寫一個rake任務,每分鐘(可能在將來每30秒)調用一次,並且它會聯繫輪詢API端點(每個用戶在我們的數據庫中)。很明顯,這不是單線程運行效率高,但可以多線程嗎?如果沒有,是否有一個好的基於事件的HTTP庫可以完成工作?多線程rake任務
6
A
回答
12
我正在寫一耙的任務,將被稱爲由每當
當心的Rails的啓動時間每分鐘(在未來,每30秒有可能),它可能是最好使用一個分叉模型,如Resque或Sidekiq,Rescue提供https://github.com/bvandenbos/resque-scheduler這應該能夠做你所需要的,我不能談論Sidekiq,但我確定它有類似的可用(Sidekiq比Resque更新)
很明顯,這不是單線程運行效率高,但有可能多線程?如果沒有,是否有一個好的基於事件的HTTP庫可以完成工作?
我建議你看一下ActiveRecord's find_each
爲讓您的取景過程更加高效,技巧,一旦你有你批你可以很容易地使用線程,如做一些事情:
#
# Find each returns 50 by default, you can pass options
# to optimize that for larger (or smaller) batch sizes
# depending on your available RAM
#
Users.find_each do |batch_of_users|
#
# Find each returns an Enumerable collection of users
# in that batch, they'll be always smaller than or
# equal to the batch size chosen in `find_each`
#
#
# We collect a bunch of new threads, one for each
# user, eac
#
batch_threads = batch_of_users.collect do |user|
#
# We pass the user to the thread, this is good
# habit for shared variables, in this case
# it doesn't make much difference
#
Thread.new(user) do |u|
#
# Do the API call here use `u` (not `user`)
# to access the user instance
#
# We shouldn't need to use an evented HTTP library
# Ruby threads will pass control when the IO happens
# control will return to the thread sometime when
# the scheduler decides, but 99% of the time
# HTTP and network IO are the best thread optimized
# thing you can do in Ruby.
#
end
end
#
# Joining threads means waiting for them to finish
# before moving onto the next batch.
#
batch_threads.map(&:join)
end
這將不啓動超過batch_size
的線程,等待每個batch_size
完成。
有可能做這樣的事情,但是接下來你將有不可控制的線程數量,還有一種選擇可能會從這裏受益,它會變得更加複雜,包括ThreadPool和共享工作列表做,我已經發布它作爲在Github so'as沒有垃圾郵件計算器:https://gist.github.com/6767fbad1f0a66fa90ac
3
相關問題
- 1. 多線程任務
- 2. 結合許多rake任務到一個rake任務
- 3. 運行多個rake任務
- 4. 多線程和多任務
- 5. 從應用程序rake任務運行gems rake任務
- 6. 在Rake任務
- 7. rake任務
- 8. rake任務
- 9. Rake「variadic」任務
- 10. 多線程任務庫,Threading.Timer或線程?
- 11. 的Java多線程任務
- 12. 多線程遞歸任務
- 13. 多線程獨立任務
- 14. 多線程任務與否?
- 15. Rake任務用於在獨立線程中運行服務器,然後在任務完成時終止線程?
- 16. 運行rake任務
- 17. Rake任務失火
- 18. 守護rake任務
- 19. rake任務指定
- 20. rake任務問題
- 21. 調試rake任務
- 22. 訂單Rake任務
- 23. 如何rake任務
- 24. rake任務變量
- 25. 調度Rake任務
- 26. 測試Rake任務
- 27. rake任務訂購
- 28. 禁用rake任務
- 29. 封閉Rake任務
- 30. 調用rake任務
ThreadPool看起來不錯!我會試試 –
好東西,謝謝:) – Robin