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

103
14

Мне нужен поток, который я создаю, чтобы умереть, если он не закончится через определенное время. Есть ли какой-нибудь элегантный и/или идиоматический способ сделать это? Прямо сейчас я думаю сделать поток наблюдателей:


def myfunc
t = Thread.new{
#do stuff
}

# watcher thread
Thread.new{
result = t.join(20) # join returns nil if it timed out
t.kill if result.nil?
}

# continue on asynchronously from both threads
end

спросил(а) 2011-10-26T04:19:00+04:00 9 лет, 11 месяцев назад
1
Решение
120

Возможно, класс Timeout - это то, что вам нужно.

def myfunc
Thread.new{
Timeout::timeout(20) {
#do stuff
}
}

# continue on asynchronously
end

ответил(а) 2011-10-26T07:24:00+04:00 9 лет, 11 месяцев назад
91

Я считаю, что в большинстве ситуаций вы должны контролировать "жизнь" потока логикой программы в потоке.

Предположим, что поток на самом деле представляет собой бесконечный цикл, вместо того, чтобы иметь равную равную (true), у вас может быть переменная экземпляра (например, is_running) и сделать цикл таким, как while (is_running). Если другой поток хочет остановить этот поток, он может просто (прямо или косвенно) сделать is_running false. Затем рабочая нить может завершить последний кусок работы и закончить цикл.

ответил(а) 2011-10-26T07:07:00+04:00 9 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема