Почему мой простой пул подключений не выполняет эти простые операторы put?

Я разместил здесь вопрос о том, как эффективно управлять потоками. Как правильно использовать потоки для подключения 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

Есть идеи?

10000