Я разместил здесь вопрос о том, как эффективно управлять потоками. Как правильно использовать потоки для подключения ping к URL?
Я получил несколько замечательных рекомендаций и советов, касающихся пулов, безопасности потоков, а также некоторых библиотек и гемов для использования. Я пытаюсь выполнить одну из перечисленных рекомендаций, используя concurrent-ruby для создания пула потоков / соединений для выполнения некоторых потоков. В простом файле ruby у меня есть следующий код:
pool = Concurrent::FixedThreadPool.new(5)
pool.post do
puts 'hello'
end
Согласно документации в concurrent-ruby, я выполнил необходимые шаги, но мой код не будет выполнен. Оператор No Put выполняется. Вот еще один пример:
pool = Concurrent::FixedThreadPool.new(5)
array = []
pool.post do
array << 1
puts 'Why am I not working?'
end
puts array.size
Размер этого массива равен 0. Код в пуле не выполняется. Я бы хотя бы ожидал размер 1. Я последовал примеру до тройника. Почему этот код не выполняется?
Всего 1 ответ
Ваш код правильный, и блок успешно передан в пул. Однако, прежде чем он будет выполнен, программа завершает работу и уничтожает пул. Вот почему вы не видите никакого вывода - у него не было достаточно времени для выполнения задания.
Вы можете добавить оператор sleep
в конце или, для более элегантного решения, сказать пулу, чтобы он завершил всю работу и завершил работу. Это будет выглядеть так:
require 'concurrent-ruby'
pool = Concurrent::FixedThreadPool.new(5)
pool.post do
puts 'hello'
end
pool.shutdown
pool.wait_for_termination