【问题标题】:Rails 4: Using ActiveRecord object from one thread in anotherRails 4:在另一个线程中使用 ActiveRecord 对象
【发布时间】:2017-01-11 19:25:13
【问题描述】:

我有两个线程。在一个线程中,我从数据库中获取一条记录作为 ActiveRecord 对象。然后我从另一个线程访问这个对象。

这种用法有问题吗? 如果两个线程使用单独的 DB 连接,如果需要访问 AR 对象的关联等,将使用哪个连接?

我在 StackOverflow 上看到了一些问题,这些问题涉及通过 ActiveRecord 从不同线程连接到数据库的缺陷以及手动签入此类连接的需要。这对这个问题有影响吗?

【问题讨论】:

  • 您使用的是什么版本的导轨?我认为最近在启动线程方面发生了一些变化
  • 我使用的是 Rails 4。这些变化是什么?

标签: mysql ruby-on-rails ruby multithreading activerecord


【解决方案1】:

你没听错。使用 AR 时,您可能会发现您需要以奇怪的方式在线程周围蹑手蹑脚地保持稳定……如果您保证永远只有 2 个线程,那么您可能至少是安全的就 AR 而言。 (当然,所有其他并发陷阱——例如死锁、线程饥饿等——仍然适用,所以一定要考虑这些。)

要记住的一点是,每个线程都会使用它的 AR 连接,因此 database.yml 中的 pool 字段必须足够高以容纳所有线程。如果您使用的是像 Puma 这样的基于线程的网络服务器,那么这可能会变得更加复杂......如果您是 Rails 的新手,我会敦促在处理线程和 AR 时要小心。这可能是一个相当大的兔子洞。

让一个线程获取对象,另一个线程访问它的目的是什么?如果您期望真正的速度优势,那么这可能是值得的,但由于第二个线程的活动(AR 记录上的操作)取决于第一个线程的结果(AR 记录的加载),那么您可能看不到速度提高,因为您需要等待第一个线程完成才能开始使用第二个线程。如果您的场景在加载对象后对第一个线程没有做任何事情,我绝对建议您不要这样做,因为您不会看到任何速度改进,但我不知道整个场景,并且使用线程可能仍然适合您的情况。

简而言之,没有什么可以阻止您在 AR 中使用线程,但这是有风险的,除非您的线程使用是保守的,否则您可以预期错误会出现在奇怪的地方。它可能对您的应用仍然有意义,但如果您确实使用线程,请先查看其他解决方案并谨慎行事。

关于“如果两个线程使用单独的数据库连接,如果需要访问 AR 对象的关联,将使用哪个连接”:每个线程获取自己的 AR 连接,因此访问 AR 关联的线程将使用自己的连接,与最初加载 AR 记录的线程无关。

在您的应用中使用线程的动机是什么?可能有更好的处理方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多