赛璐珞演员 - 如何在使用期货时用 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 {}
个方块,但您是对的,那些确实不正常。
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 {}
个方块,但您是对的,那些确实不正常。