gpt4 book ai didi

ruby-on-rails - resque和redis等待变量被设置

转载 作者:可可西里 更新时间:2023-11-01 11:23:03 25 4
gpt4 key购买 nike

目前我在 rails 3.1 rc4 上运行并使用 redis 和 resque 来排队创建机架空间服务器。

我正在使用的 rackspace gem,cloudservers,会在您的服务器使用状态方法完成设置时告诉您。

我试图用下面的代码做的是仅在服务器处于事件状态并准备好使用后才执行 elsif 中的代码。

class ServerGenerator
@queue = :servers_queue
def self.perform(current_id)
current_user = User.find(current_id)
cs = CloudServers::Connection.new(:username => "***blocked for security***", :api_key => "***blocked for security***")
image = cs.get_image(49) # Set the linux distro
flavor = cs.get_flavor(1) # Use the 256 Mb of Ram instance
newserver = cs.create_server(:name => "#{current_user.name}", :imageId => image.id, :flavorId => flavor.id)


if newserver.status == "BUILD"
newserver.refresh
elsif newserver.status == "ACTIVE"
# Do stuff here, I generated another server with a different, static name
# so that I could see if it was working

cs = CloudServers::Connection.new(:username => "***blocked for security***", :api_key => "***blocked for security***")
image = cs.get_image(49)
flavor = cs.get_flavor(1)
newserver = cs.create_server(:name => "working", :imageId => image.id, :flavorId => flavor.id)
end
end
end

当我运行上面的代码时,它只生成了第一个使用“current_user.name”的服务器,因为它是名称。循环会帮助解决 if 语句吗?这似乎也是一种糟糕的任务排队方式。我是否应该加入一个新任务来检查服务器是否准备就绪?

非常感谢!

最佳答案

根据您所写的内容,我假设 cs.create_server 是非阻塞的。在这种情况下,是的,您需要将检查包装在一个 do ... 循环或一些类似的结构中。否则,您将精确地检查一次值,然后退出 perform 方法。

如果您要在方法中循环,则应添加 sleep 调用,否则您将无所事事地消耗大量 CPU 周期。是循环还是调用单独的工作最终取决于您以及您的工作人员是否大部分空闲。换句话说,如果需要 5 分钟。为了让您的服务器启动,您只是循环,该工作人员将无法在 5 分钟内处理任何其他作业。如果这是可以接受的,那肯定是最容易做的事情。如果 Not Acceptable ,您可能需要另一个作业来接受您的服务器 ID 并进行 API 调用以查看它是否可用。

虽然这个过程本身可能很棘手。如果您的服务器出于某种原因从未上线,您可能会发现自己正在创建作业,等待它的状态无休止地进行。因此,您可能也想传递某种执行计数,或者在 Redis 中进行跟踪,以便在尝试 X 次后停止尝试。我还会查看 resque-scheduler因此在这种情况下,您可以控制何时执行您的作业。

关于ruby-on-rails - resque和redis等待变量被设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552680/

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