赛璐珞演员 - 如何在使用期货时用 Celluloid.shutdown_timeout 终止所有演员

celluloid actor - how to terminate all actors with Celluloid.shutdown_timeout while using futures

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)

到目前为止,它似乎工作正常,actors 在 1 秒后关闭。

  y.value

但是当我尝试像上面那样访问值时,它一直持续到方法调用返回的值可用为止。

我的想法是像标准 Timeout.timeout(1) {}

一样使用 Celluloid.shutdown_timeout

如果超过 1 秒的时间限制,则终止块 [Timeout.timeout(1) 因行为不端而臭名昭著,因此不使用它]

使用赛璐珞演员实现这一目标的正确方法是什么?

没有。这不是 shutdown_timeout 的工作方式。

Celluloid.shutdown_timeout 用于 at_exit 在底层进程终止时关闭 actors。当进程收到终止信号时使用。

您确实需要放入 Timeout.timeout {} 个方块,但您是对的,那些确实不正常。