【问题标题】:How to run two functions concurrently from one route in Sinatra?如何从 Sinatra 中的一条路线同时运行两个功能?
【发布时间】:2014-11-10 04:36:45
【问题描述】:

我正在尝试了解 Ruby 与 Sinatra 应用程序的并发性。
这里是:

require 'sinatra'

get '/a' do
    sleep 10
    "result_a"
end

get '/b' do
    "result_b"
end

如果我以 ruby app.rbshotgun app.rb 运行它,然后转到 /a/b - /b/a 执行并自行加载之前不会加载。
但是,当我将此应用程序部署到 Heroku 并转到 /a 然后 /b 时,会立即加载 /b
据我了解,Heroku 进程是并发(或多线程?),而不是我的本地进程。

我的问题是:如何在本地服务器上同时运行我的应用程序? 是否可以从一条路线同时运行两个功能?

【问题讨论】:

    标签: ruby multithreading heroku concurrency sinatra


    【解决方案1】:

    安装独角兽。

    gem install unicorn
    

    official docs 不是很好,但您可以找到大量教程,向您展示如何配置和启动并行服务器进程,从而允许您同时处理多个请求。

    它通过分叉你的进程来工作,这意味着它是完全线程安全的,但也意味着并发请求不会相互共享内存状态。事实上,它们根本不会共享内存,因此如果您的应用程序具有真正巨大的内存占用(例如某种内存数据库),您将需要一个不同的解决方案。否则,Unicorn 是一个非常流行且可靠的 Ruby Web 应用程序并发工具;它实际上可能是允许 Heroku 展示您所看到的并发性的原因。

    【讨论】:

    • 啊。不,听起来您可能需要使用 Ruby 的 Thread 功能。您正在处理的是一个相当棘手的问题,但并非不可能。
    • Unicorn 将允许我从一条路线同时运行多个功能? [知道了,Ruby 的Thread,谢谢]
    • Unicorn 将允许您同时运行来自同一路由的两段单独的代码,或同时运行同一段代码两次。这取决于您将路线设置为做什么。但是,Unicorn 不允许您从两个单独请求的上下文中对内存中的同一对象执行操作。
    • 嗯,听起来不错——我已经有了 websockets 用于在保持浏览器会话的同时与视图交互,现在我只需要同时打开我的 Watir 页面。我认为这可行。
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多