Почему мой простой пул подключений не выполняет эти простые операторы put? - PullRequest
1 голос
/ 11 февраля 2020

Я разместил здесь вопрос о том, как эффективно управлять потоками Как правильно использовать потоки для подключения ping к URL-адресу?

Я получил несколько замечательных рекомендаций и советов, касающихся пулов, безопасности потоков, а также некоторых библиотек и гемов для использования. Я пытаюсь выполнить одну из перечисленных рекомендаций, используя concurrent- ruby для создания пула потоков / соединений для выполнения некоторых потоков. В простом файле ruby у меня есть следующий код:

pool = Concurrent::FixedThreadPool.new(5)

pool.post do
  puts 'hello'
end

В соответствии с документацией в одновременном - 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 Ответ

2 голосов
/ 12 февраля 2020

Ваш код правильный, и блок успешно передан в пул. Однако, прежде чем он будет выполнен, программа завершает работу и уничтожает пул. Вот почему вы не видите никакого вывода - у него не было достаточно времени для выполнения задания.

Вы можете добавить оператор sleep в конце или, для более элегантного решения, сообщить пулу о завершении sh все работают и закрываются. Это будет выглядеть так:

require 'concurrent-ruby'

pool = Concurrent::FixedThreadPool.new(5)

pool.post do
  puts 'hello'
end

pool.shutdown
pool.wait_for_termination
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...