Ruby中的并行mysql I / O.

时间:2015-04-09 04:07:08

标签: mysql ruby multithreading parallel-processing

祝你好运。我正在编写一个cron作业,希望将一个巨大的MySQL表分成几个线程并对它们做一些工作。这是我目前所拥有的最小样本:

require 'mysql'
require 'parallel'
@db = Mysql.real_connect("localhost", "root", "", "database")
@threads = 10

Parallel.map(1..@threads, :in_processes => 8) do |i|
  begin
    @db.query("SELECT url FROM pages LIMIT 1 OFFSET #{i}")
  rescue Mysql::Error => e
    @db.reconnect()
    puts "Error code: #{e.errno}"
    puts "Error message: #{e.error}"
    puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate")
  end
end
@db.close

线程不需要返回任何东西,他们得到他们的工作份额,他们就是这样做的。只有他们没有。在查询期间,与MySQL的连接是否丢失,或者连接是否存在(MySQL服务器已经消失?!),或no _dump_data is defined for class Mysql::Result然后Parallel::DeadWorker

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

map方法需要一个结果;我不需要结果,所以我切换到each

Parallel.each(1..@threads, :in_processes => 8) do |i|

这也解决了MySQL的一个问题:我只需要在并行进程内启动连接。使用each循环时,它是可能的。当然,连接也应该在流程内部关闭。