祝你好运。我正在编写一个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
。
如何做到这一点?
答案 0 :(得分:1)
map
方法需要一个结果;我不需要结果,所以我切换到each
:
Parallel.each(1..@threads, :in_processes => 8) do |i|
这也解决了MySQL的一个问题:我只需要在并行进程内启动连接。使用each
循环时,它是可能的。当然,连接也应该在流程内部关闭。