2014-11-08 38 views
1

给定一个赛璐珞Actor的实例,您可以使用future来异步执行Actor方法,并在稍后的某个时间点使用Future的value方法来获取Actor方法的结果(如果需要阻塞)。Ruby赛璐珞:附加到已经进行中Future

假设我在系统中有两个单独的组件,都希望使用相同的Actor方法,可能是非常昂贵的数据库查询。如果这两个组件单独调用actor.future.expensive_query,那么该查询将执行两次,每个调用者都会将自己的单独Future对象返回以检索结果。此外,这两个查询将连续执行,而不是同时执行。相反,如果我想第二次调用actor.future.expensive_query来获取对第一个调用者创建的Future对象的引用?赛璐珞可能会有这样的事情吗?

回答

0

是的,但它也可能与普通Ruby,我会告诉你。

例如,使用自定义访问:

def expensive_query!(*args) 
    @expensive_query ||= future.expensive_query(*args) 
    if @expensive_query.is_a? Celluloid::Future 
    @expensive_query = @expensive_query.value 
    end 
    @expensive_query 
end 

请记住,如果你想再次运行该查询,则需要在外部做这个地方......否则你会是拉拽已经运行查询(存储在@expensive_query)的结果:

@expensive_query = nil 

也许在reset_expensive_query!例如。