Целлулоидный актер - как уничтожить всех актеров с помощью Celluloid.shutdown_timeout при использовании фьючерсов
require 'celluloid/current'
Celluloid.shutdown_timeout = 1
class Mapper
include Celluloid
attr_accessor :value
def run(num)
@value = num.times.map { |idx| idx }
end
end
y = Mapper.spawn
y.future.run(1000000)
До сих пор, кажется, работает, и актеры отключаются через 1 секунду.
y.value
Но в тот момент, когда я пытаюсь получить доступ к значению, как описано выше, оно продолжается до тех пор, пока значение, возвращаемое из вызова метода, не станет доступным.
Моя идея состояла в том, чтобы использовать Celluloid.shutdown_timeout, как и стандартный Timeout.timeout(1) {}
и прекратить блок, если он превышает 1 сек. [Timeout.timeout (1) известен тем, что плохо себя ведет, поэтому не использует его]
Как правильно достичь этого, используя целлулоидных актеров?
1 ответ
Нет, это не так shutdown_timeout
работает.
Celluloid.shutdown_timeout
используется at_exit
отключить актеров, когда основной процесс завершается. Он используется, когда процесс получает сигнал уничтожения.
Вам нужно поставить Timeout.timeout {}
блокирует, но вы правы, те плохо себя ведут.