在Ruby中并行运行命令行进程

| 我正在使用PhantomJS(一种命令行工具)来渲染网站的图像,我想并行运行许多此类图像,而不是一个接一个地运行。我怎样才能做到这一点?     
已邀请:
        这是使用Resque的示例。请注意,为了简洁起见,我已经转义了……您永远不要将外部输入直接传递到Shell命令中。
class RasterizeWebPageJob
  @queue = :screenshots
  def self.perform(url)
    system(\"/usr/bin/env DISPLAY=:1 phantomjs rasterize.js #{url} ...\")
  end
end

10.times { Resque.enqueue(RasterizeWebPageJob, \"http://google.com/\") }
如果您正在运行足够的工作程序(并且有可用的工作程序),它们将并行执行。这里重要的是,您将单独的作业放在队列中,而不是从一个作业中处理多个屏幕截图。 我建议不要在Rails控制器中使用ѭ1。队列比线程更容易(更安全)进行管理。     
        有多种实现方法。您正在寻找的是在后台执行异步作业。该视频可能会有所帮助:http://railscasts.com/episodes/128-starling-and-workling     
        我认为这些其他答案可能会缺少的是,对您将要使用的设计模式进行基础教育。是的,Resque或Starling和Workling或Resque结合Foreman将是很好的解决方案,但是您可能想知道为什么。 我相信您要使用的模式简称为“观察者模式”或“发布者-订阅者”或“ PubSub”。在最简单的情况下,该想法类似于打印机的工作方式。 一个人(发布者)在Web浏览器中单击打印。然后,打印机进行异步打印。打印机(如果未打开)将在开机时接收消息。如果有多个人将文档发送到打印机,则打印机将按顺序(FIFO)选择它们,然后进行处理(打印)。如果有多个打印机在侦听同一队列(这是隐喻崩溃的原因,因为通常您没有这个隐喻),那么他们可以依次选择消息以更快地处理队列。 Resque和其他PubSub宝石,项目,JAR(您不仅限于Ruby)实现了这种设计模式。 有关此模式的更多信息(请注意,Java Observable是一个类,这是一个糟糕的设计决策。您可以实现自己的类): http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html http://en.wikipedia.org/wiki/Observer_pattern http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern 对于我们的处理,我们将Resque用于较小的任务,但是您仍然受限于全局解释器锁定和其他问题,例如必须将代码部署到服务器,安装gems等。我们现在使用Storm(https:// github .com / nathanmarz / storm)来处理我们的流处理,效果会更好。对于您要执行的操作,Storm可能会显得过大,具体取决于您每天要处理多少张图像。     

要回复问题请先登录注册