如何在Rails启动时创建线程?

2024-07-03

我试图在 Rails 启动时创建一个线程,该线程将在应用程序的整个生命周期中运行。奇怪的是,我已经将其与我正在运行的另一个线程一起使用了。我复制了该(工作)代码并将其用作新线程的新代码的样板。但线程不会启动。

  • 代码位于配置/初始化程序中(这是正确的位置吗?)。
  • 文件以“z_...”开头命名,以确保它最后运行。
  • 导轨3.2.6

这是代码的一般结构:

class Blah
  def self.the_thread
    The_Model.transaction do
    # do some database stuff
    # ...
  end

  TheThread = Thread.new do
    while true do
      the_thread
      sleep 5.seconds
    end
  end
end

打开 Rails 控制台并检查 Blah::TheThread 会发现一个似乎从未运行过的死线程。类的声明中似乎没有任何错误,方法中也没有任何错误,因为当我打开 Rails 控制台时,我可以运行该方法并且它工作得很好。另外,如果我手动在 Rails 控制台中输入上面生成线程的确切代码(TheThread = Thread new do ...),它就可以正常工作(每 5 秒唤醒一次,执行其操作,然后再次休眠)。

同样,奇怪的是,这个在 Rails 中生成简单线程的样板文件以前在这个完全相同的应用程序中为我工作过。

如果有人对我认为奇怪的问题有一些可能的见解,我会洗耳恭听。

Thanks.

编辑:新信息 - 我刚刚注释掉了事务调用(和匹配结束),它工作正常。我不知道交易会干扰什么。我删除了其他自定义初始化脚本,目录中唯一的其他脚本要么是默认脚本,要么是属于设计的脚本。我仔细阅读了它们,没有看到任何交易正在进行。

更多新信息。我在线程代码末尾添加了“TheThread.abort_on_exception = true”。当我启动 Rails 时,我现在收到异常“ArgumentError:在关闭的数据库上调用准备:回滚事务(ActiveRecord::StatementInvalid)”。错误发生在 sqlite3 gem 中。我有 sqlite3 gem 版本 1.3.6 和 sqlite-ruby gem 版本 1.3.3。我用谷歌搜索了这个错误,发现有几个帖子抱怨同样的错误,但没有看到任何解决方案。

我不再认为这是一个线程问题,而是一个数据库问题,但为时已晚更改这篇文章的标题。

这只是:我在线程代码的顶部放置了一个“睡眠 15.秒”(就在进入 while 循环之前),这解决了问题。但我仍然想知道是什么导致了这个问题,以及“非黑客”解决方案是什么。由于某种原因,此代码运行时数据库尚未准备好。我的初始化代码是否放置在错误的位置?


我真的建议寻找另一种方法来实现这一点。除非你真的需要 1 个额外的线程每个实例当您投入生产时(想象一下设置 3-4 个瘦/杂种/等服务器 - 每个服务器都有额外的线程),有更好的方法来解决它。

选项 1 - 最简单的 - 只是创建一个控制器操作来执行您的任务,然后使用 wget 和 cron 定期触发该操作。

20 * * * *  /usr/bin/wget --quiet -O - 'http://www.mydomain.com/my_controller/my_action'

这里的问题是你必须处理身份验证/访问控制 - 除非你真的不关心某个随机用户是否可以触发你的工作(坦率地说,有时非常简单的工作就是这种情况)。

选项 2 - 使用发条 https://github.com/tomykaira/clockwork/Sidekiq http://mperham.github.com/sidekiq/或BackgroundRb 或其他在后台运行任务的方式。我已经在生产应用程序中完成了此操作,并且效果非常好。我选择了 Clockwork 和 Sidekiq,我的计划任务如下所示:

应用程序/workers/daily_worker.rb:

class DailyWorker
  include Sidekiq::Worker

  def perform
    # do stuff here
  end
end

发条.rb:

require 'clockwork'
require 'sidekiq'

Dir["app/workers/*"].each {|f| load f }

module Clockwork
  every 1.day, 'daily.jobs', :at => "00:30" do
    DailyWorker.perform_async
  end
end

这对我来说似乎是best解决方案 - 我只花了大约 15 分钟就可以全部启动并运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Rails启动时创建线程? 的相关文章

  • 如何获取当前正在执行的 NSOperation?

    有没有相当于 NSOperationQueue currentQueue or NSThread currentThread for NSOperation 我有一个相当复杂的域模型 其中繁重的处理发生在调用堆栈的深处 为了及时取消操作 我
  • 基于 2 列定义唯一主键

    我想根据两列为记录定义一个唯一键 id 和 语言 让用户提交以下字符串 id 1 语言 en 值 blabla 英语 id 1 语言 fr 值 blabla 法语 我尝试使用 set primary key 和 add index 但它不起
  • ExecJS::RuntimeError:语法错误:意外的令牌运算符

    RAILS ENV production rake assets precompile trace Digest Digest is deprecated use Digest Digest Digest is deprecated use
  • 使用 .env 文件在生产环境中设置 SECRET_KEY_BASE

    I ve a env文件位于我的生产根文件夹中 该文件定义了SECRET KEY BASE这是用在config secrets yml 问题是我无法加载我的 env在我之前提交文件config secrets yml 我尝试过使用doten
  • 我可以在没有 ExecutorService 的情况下使用 Callable 线程吗?

    我可以在没有 ExecutorService 的情况下使用 Callable 线程吗 我们可以在没有 ExecutorService 的情况下使用 Runnable 的实例和 Thread 的子类 并且此代码可以正常工作 但这段代码始终有效
  • Postgres / Rails Active Record -- 查询舍入浮点值

    我在 Rails 应用程序中使用 Postgres 将纬度 经度作为浮点值存储在数据库中 我希望能够比较位置的纬度 经度 但我只知道如何做到完全相等 Location where lat lat lon lon 我的问题是 我希望 Post
  • ManualResetEvent WaitOne 未解锁

    我对我正在使用的 ManualResetEvent 有点困惑 它似乎没有解锁 有谁知道为什么会出现这种情况 我得到的场景就是这样的 真实的情况相当复杂 我还没有成功地隔离出一段可以合理发布来重现问题的代码 EDIT我更新了下面的代码示例 这
  • ManualResetEvent WaitOne 未解锁

    我对我正在使用的 ManualResetEvent 有点困惑 它似乎没有解锁 有谁知道为什么会出现这种情况 我得到的场景就是这样的 真实的情况相当复杂 我还没有成功地隔离出一段可以合理发布来重现问题的代码 EDIT我更新了下面的代码示例 这
  • 从 json 对象初始化 Typescript 中的 Map

    这个问题在这里已经有答案了 我在 Typescript 中有一个包含地图的类 public map Map
  • Rails 迁移:尝试将列的类型从字符串更改为整数

    我使用rails生成迁移命令在rails应用程序中创建了一个表 这是迁移文件 class CreateListings lt ActiveRecord Migration def change create table listings d
  • Rust mpsc::Sender 不能在线程之间共享?

    我认为通道的全部目的是在线程之间共享数据 我有这个代码 基于这个例子 http rustbyexample com std misc channels html let tx thread tx clone let ctx self thr
  • 具有 has_many 和 has_one 多态关联的工厂女孩

    我目前正在开发一个项目 我想使用 Factory Girl 创建测试 但我无法使其与多态 has many 关联一起工作 我已经尝试了其他文章中提到的许多不同的可能性 但它仍然不起作用 我的模型看起来像这样 class Restaurant
  • 在 Spring Boot 应用程序中使用 Azure KeyVault 作为数据库密码

    我正在开发一个应该部署到 Azure 的 Spring Boot 应用程序 使用以下依赖项 我设法将 KeyVault 中的机密用于敏感应用程序属性
  • 使用axlsx以延迟作业方法创建excel

    我正在尝试在模型中的延迟作业方法中生成 Excel 文件 在本地运行良好 我正在使用调度程序在heroku 中运行延迟作业 作业已成功完成 无需生成 Excel 我的延迟工作方法如下所示 def self generate excel Ax
  • Azure Web 作业 - 从队列触发 - 触发还是连续?

    我创建了一个 Web 作业 想要部署到 azure 但是 当您创建它时 我对配置感到困惑 这是一个从 azure 存储队列触发的 Web 作业 它在本地运行良好 然而 当我在 azure 中创建 Web 作业时 我对这些选择感到困惑 我的选
  • Pthread Mutex:pthread_mutex_unlock() 消耗大量时间

    我用pthread编写了一个多线程程序 使用生产者 消费者模型 当我使用 Intel VTune profiler 来分析我的程序时 我发现生产者和消费者在 pthread mutex unlock 上花费了大量时间 我不明白为什么会这样
  • ruby 中 CSV.open( ) 的第二个参数/参数是什么?

    我想我在这里遗漏了一些非常明显的东西 但是每个人为 CSV open 方法输入的第二个参数是什么 在本例中是 wb 我已经看到这里放了其他字母 但没有人真正解释了它的作用 它有什么作用 CSV open path to file csv w
  • 测试最终字段的初始化安全性

    我试图简单地测试 JLS 保证的最终字段的初始化安全性 这是为了我正在写的一篇论文 但是 根据我当前的代码 我无法让它 失败 有人可以告诉我我做错了什么 或者这只是我必须一遍又一遍地运行然后在一些不幸的时机看到失败的事情吗 这是我的代码 p
  • ActiveRecord::Base:Class 的未定义方法 raise_in_transactional_callbacks=' (NoMethodError)

    在写这个问题之前 我查看了这些答案 但无法找到解决方案 执行rails生成scaffold时出错 用户名 string email string https stackoverflow com questions 24874678 erro
  • Rails 计算时间差

    我已经尝试过这样的代码 但它不起作用 require time diff cur time Time now strftime Y m d H M time diff components Time diff art datetime of

随机推荐