Mam program, który tworzy 10000 wątków jednocześnie i działa 8 w tym samym czasie.Dlaczego Ruby nie ma wbudowanego ThreadPool?
Ale ruby nie ma wbudowanego ThreadPool jako Java. Czy istnieje dobry powód?
Mam program, który tworzy 10000 wątków jednocześnie i działa 8 w tym samym czasie.Dlaczego Ruby nie ma wbudowanego ThreadPool?
Ale ruby nie ma wbudowanego ThreadPool jako Java. Czy istnieje dobry powód?
Najprawdopodobniej powodem jest to, że ruby nie mają nici "prawdziwych". Ma to, co nazywane jest zielonymi nitkami. Interpreter ruby zajmuje się planowaniem wątków wykonywania bez użycia żadnych bazowych wątków systemu operacyjnego. To skutecznie sprawia, że Ruby jest pojedynczym wątkiem.
Mimo że YARV (ruby 1.9) używa tylko jednego procesora na raz, nie sądzę, że używa on zielonych wątków. –
Zielone wątki nie sprawiają, że pule wątków są bezużyteczne. Jeden wątek może czekać na coś zewnętrznego do programu, podczas którego można zaplanować kolejny wątek. Używanie zielonych wątków jest często (zwykle?) Bardziej wydajne niż przetwarzanie sekwencyjne. – Kelvin
prawdopodobnie dlatego, że łatwo jest przetasować własne przy użyciu standardowej biblioteki "Kolejka".
q = Queue.new
3.times { Thread.new { while something = q.pop(true) rescue nil; ... }
Jest to jednak dobre pytanie - mogę zaproponować, aby porozmawiać z Ruby Core.
Czy otrzymałeś jakąś odpowiedź? –
Nie mogę sobie nawet przypomnieć, czy teraz zapytałem ... – rogerdpack
Podejrzewam, że to dlatego, że ThreadPool nie byłby przydatny w implementacjach Rubiego opartych na języku C. Możesz użyć tylko jednego procesora naraz za pomocą Ruby Intepreter Matza lub Yet Another Ruby VM.
Jeśli chcesz, aby wiele wątków było uruchamianych na wielu procesorach, musisz zamiast tego użyć JRuby.
Dokładnie. Puli wątku, zielone nici, bezcelowe. – Joshua
Na pewno nie ma sensu, jeśli masz blokujące IO? –
@Andy dobry punkt. –
Tak, myślałem coś podobnego do ExecutorService Javy. – JohnMerlino