Целлулоидный актер - как уничтожить всех актеров с помощью 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 {} блокирует, но вы правы, те плохо себя ведут.

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