ruby-on-rails - Rails 中的线程 - params[] 是否持续存在?

标签 ruby-on-rails multithreading request response

我正在尝试在 Rails 中生成一个线程。我通常不太习惯使用线程,因为我需要深入了解 Rails 的请求/响应周期,但我无法避免在请求超时时使用线程。

为了避免超时,我在一个请求中使用了一个线程。我的问题很简单。我使用的线程访问其中的 params[] 变量。现在一切似乎都正常了。我想知道这是否正确?如果有人可以阐明在请求/响应周期中在 Rails 中使用线程,我会很高兴。

[开始赏金]

最佳答案

简短的回答是肯定的,但只是在一定程度上;创建线程的绑定(bind)将继续存在。仅当没有人(包括 Rails)特意修改或删除 params 散列时,params 才会仍然存在。相反,它们依靠垃圾收集器来清理这些对象。由于线程在创建时可以访问当前上下文(在 Ruby 中称为“绑定(bind)”),因此可以从该范围访问的所有变量(实际上是创建线程时的整个状态)不能被垃圾删除集电极。但是,随着在主线程中继续执行,该上下文中的变量值可以由主线程更改,甚至可以由您创建的线程更改,如果它可以访问它的话。这是线程的优点和缺点:它们与其他一切共享内存。

您可以模拟一个与 Rails 非常相似的环境来测试您的问题,使用如下函数:http://gist.github.com/637719 .如您所见,代码仍然打印 5。

但是,这不是执行此操作的正确方法。将数据传递给线程的更好方法是将其传递给 Thread.new,如下所示:

# always dup objects when passing into a thread, else you really
# haven't done yourself any good-it would still be the same memory
Thread.new(params.dup) do |params|
  puts params[:foo]
end

这样,您可以确定对参数的任何修改都不会影响您的线程。最佳做法是使用以这种方式传递给线程的数据,或者线程本身创建的数据。依赖线程外的程序状态是危险的。

如您所见,不推荐这样做是有充分理由的。多线程编程困难,即使在 Ruby 中也是如此,尤其是当您处理与 Rails 中使用的库和依赖项一样多的时候。事实上,Ruby 似乎让它看起来很容易,但它基本上是一个陷阱。您将遇到的错误非常微妙;它们将“随机”发生并且很难调试。这就是为什么 Resque、Delayed Job 和其他后台处理库被广泛使用并推荐用于 Rails 应用程序的原因,我也会推荐它们。

关于ruby-on-rails - Rails 中的线程 - params[] 是否持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888981/

相关文章:

java - Request.getParameter java 到 vb.net

node.js - (Nodejs)谷歌oAuth2 : Required parameter is missing: grant_type

ruby-on-rails - Ruby 可读的用户代理?

ruby-on-rails - 大约 30 个 RoR 应用程序等待(卡住)1 个应用程序启动。这如何解决?

ruby-on-rails - GPGME Passphrase 提示问题(Ruby)

java Callable FutureTask Excecuter : How to listen to finished task

button - 如何使单击按钮以特定顺序向服务器发送两个不同的请求

ruby-on-rails - 将基于 cloud9 的 rails 应用程序部署到本地 linux 服务器

C中的打印函数mutex无法正常工作

c++ - 用于并行化我的代码的 TBB 教程/文档?