我无法让我的dynos运行多个延迟的工作进程。
我的Procfile如下所示:
worker: bundle exec script/delayed_job -n 3 start
我的delayed_job
脚本是gem提供的默认脚本:
#!/usr/bin/env ruby
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
require 'delayed/command'
Delayed::Command.new(ARGV).daemonize
当我尝试在本地或Heroku dyno上运行时,它会静静地退出,我无法分辨出发生了什么。
foreman start
16:09:09 worker.1 | started with pid 75417
16:09:15 worker.1 | exited with code 0
16:09:15 system | sending SIGTERM to all processes
SIGTERM received
任何有关如何调试问题的帮助或有关在单个dyno上运行多个worker的其他方法的建议都将非常感激。
答案 0 :(得分:14)
您可以使用foreman在同一个dyno上启动多个进程。
首先,将工头添加到您的Gemfile中。
然后在 Procfile :
中添加worker
行
worker: bundle exec foreman start -f Procfile.workers
创建一个名为 Procfile.workers 的新文件,其中包含:
dj_worker: bundle exec rake jobs:work
dj_worker: bundle exec rake jobs:work
dj_worker: bundle exec rake jobs:work
这将在你的工作人员dyno上启动3名delayed_job工作人员。
答案 1 :(得分:6)
尝试将Procfile更改为:
worker: bundle exec script/delayed_job -n 3 run
使用start
将在后台创建两个守护进程,然后立即退出。 Heroku认为你的过程崩溃了。
使用run
可将工作人员置于前台。
更新:我现在使用Delayed Job Worker Pool。
答案 2 :(得分:0)
简短的回答是你不能用delayed_job来做这件事。 dyno是一个进程,一个delayed_job工作者可以处理单个进程。
但是还有其他解决方案。如果您可以切换到使用Sidekiq,那么您可以在一个进程上运行相当多的工作人员,因为Sidekiq工作人员使用线程。这里的权衡是你的工人需要线程安全。
检查出来:http://sidekiq.org/
答案 3 :(得分:0)
我试图使用@infused的公认解决方案,但遇到一个问题,工作进程在启动时崩溃
Bundler::GemNotFound: Unable to find a spec satisfying web-console in the set. Perhaps the lockfile is corrupted?
其原因是foreman start
默认正在寻找.env
文件并读取它:Forman Manual。
因为.env
文件是为开发环境设置的,所以工头正在寻找web-console
宝石,但缺少它。
结论:如果您看到工作人员没有开始,请检查您是否有一个不适合生产的.env
文件,然后重命名该文件或在启动时指定另一个文件。