如何使用线程池写入我的数据库?

时间:2013-06-22 12:35:08

标签: ruby-on-rails ruby multithreading activerecord thread-safety

我正在使用https://github.com/meh/ruby-thread中讨论的线程池来生成多个下载程序。

我正在尝试下载许多RSS源的内容,总共有近200K的源,但是在调用ActiveRecord的save方法时,我在MySQL数据库中遇到锁定和并发问题。

我很确定我需要指定一个线程来与数据库交互并向这个线程发送信号,但我不确定如何构建它。

1 个答案:

答案 0 :(得分:4)

看看Ruby的Queue课程。

创建一个队列,用于在将数据发送到数据库之前保存记录信息。您的所有RSS线程都将其写为“生产者”。

创建一个只从该队列中读取并作为“使用者”写入数据库的新线程。它应该毫不费力地保持领先于RSS线程。

你需要join所有线程的主代码,包括数据库使用者,所以所有线程在应用程序退出之前完成,否则你可能最终得到未写入的记录。

由于您没有显示任何源代码,我们无法帮助您集成它,但它应该很容易实现。