我有兴趣运行一个运行时间很长的 rake 任务,这个任务需要几个小时才能完成,我有兴趣了解处理这个问题的最佳实践。
我发现的可能解决方案:
- 设置 cron 作业
- 延迟作业
- 回复
cron 似乎是一个简单的设置解决方案,但它是否适合非常长的任务?您使用什么以及您的解决方案的优点/缺点是什么?
我有兴趣运行一个运行时间很长的 rake 任务,这个任务需要几个小时才能完成,我有兴趣了解处理这个问题的最佳实践。
我发现的可能解决方案:
cron 似乎是一个简单的设置解决方案,但它是否适合非常长的任务?您使用什么以及您的解决方案的优点/缺点是什么?
我个人喜欢 Resque,您可以使用 resque-scheduler gem 来处理长时间运行或周期性的任务。
如果您不必经常运行您的任务,您可以妖魔化 rake 任务,以确保它在您的 SSH 会话终止或其他情况下继续运行。
尝试这样的事情:
nohup rake my:task &
nohup
会将输出发送到nohup.out
您运行任务的目录中,并且还会让您的 ssh 会话在进程不死的情况下退出,其次&
将其作为守护进程运行。
在我创建的一个应用程序中,用户能够上传 PDF 文件,这些文件在上传时被缩略图以创建预览图像。由于 PDF 可能非常大,缩略图可能需要一段时间并且必须在后台运行。为此,我使用了
从好的方面来说,你得到了漂亮的 Resque GUI 来查看你的工人在行动,你有上帝在那里观察(并杀死,并重新启动)失控的进程(当你在处理时往往会发生很多ImageMagick 中的 PDF),使整个事情更加稳定和可靠。
不利的一面是,设置它比 cron 作业要难得多。但是让 cron 在不受监控的情况下运行一个长时间的、内存密集型的进程对我来说似乎是一场灾难。
希望有帮助!