Подождите, пока в Ruby не уйдет поток

Похоже, что в Ruby 2.4 и 2.5 потоки не умирают, как только вы вызываете #kill на них. Этот фрагмент кода напечатает Не мертвый несколько раз:

thread = Thread.new { loop {} }
thread.kill
puts "Not dead" while thread.alive?

Я хотел бы заблокировать выполнение основного потока, пока вторичный поток не будет уничтожен. Я пытался с помощью thread.join.kill, но, конечно, это блокирует основной поток, потому что цикл потока никогда не заканчивается.

Как я могу убедиться, что поток завершен до того, как основной поток продолжится?

1 ответ

Решение

Догадаться; ты еще можешь #join нить после убийства, так что вы можете использовать thread.kill.join блокировать до тех пор, пока нить не умрет.

Этот код никогда не печатает Не мертв:

thread = Thread.new { loop {} }
thread.kill.join
puts "Not dead" while thread.alive?

Я делаю это:

thread = Thread.new { loop {} }
thread.kill
sleep 0.001 while thread.alive?

Вот как я завершаю темы в моем ThreadPool.

Другие вопросы по тегам