gpt4 book ai didi

ruby - 如何在不阻塞 react 器的情况下在 EventMachine 中运行同步长时间运行的操作?

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:54 27 4
gpt4 key购买 nike

我想按指定顺序运行一系列 Proc(即,它们不能异步运行)。其中一些可能会花费任意长的时间。

我的代码在 EventMachine react 器的上下文中运行。在不阻塞主 react 器的情况下,是否有编写此类代码的已知惯用语?

最佳答案

正如@maniacalrobot 所说,使用 EM.defer/deferrable 可以让过程在不阻塞 react 器的情况下运行。但是,当您需要连续运行多个过程时,您就会进入“回调 hell ”。

我知道两种使代码更具可读性的解决方案:promises 和 fibers。

Promises 为您提供了一个很好的 API 来编写异步调用,那里有很多好文章,包括:

Fibers 是一种更特定于 ruby​​ 的工具,它使您的代码在执行异步操作时看起来是同步的。

这是一个异步(延迟)执行 proc 的辅助方法,但仍然阻塞调用代码而不阻塞主 react 器(这就是 Fibers 的魔力):

def deferring(action)
f = Fiber.current

safe_action = proc do
begin
res = action.call
[nil, res]
rescue => e
[e, nil]
end
end

EM::defer(safe_action, proc { |error, result| f.resume([error, result]) })

error, result = Fiber.yield

raise error if error

result
end

使用示例:

action1_res = deferring(proc do 
puts 'Async action 1'
42
end

begin
deferring(proc do
puts "Action1 answered #{action1_res}"
raise 'action2 failed'
end)
rescue => error
puts error
end

关于ruby - 如何在不阻塞 react 器的情况下在 EventMachine 中运行同步长时间运行的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21706480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com