在Ruby中线程化sqlite连接

时间:2016-06-18 21:53:10

标签: ruby multithreading sqlite parallel-processing

从昨天开始,我一直试图让我的ruby脚本成为线程。我已经选择了SQLite来保存数据,使用并行gem来管理并发。

我已经构建了一个用于测试的快速脚本,但是我无法使线程正常工作;数据库已锁定。我已经将db.close添加到最后,这没有帮助,我已经尝试添加睡眠直到db.closed?,但这只是无限期地睡觉。我究竟做错了什么?

错误是“数据库被锁定(SQLite3 :: BusyException)”。

这是我的代码:

require 'sqlite3'
require 'pry'
require 'parallel'
STDOUT.sync = true
db = SQLite3::Database.new "test.db"
arr = [1,2,3,4,5,6,7,8,9,10]

rows = db.execute <<-SQL
create table test_table (
    original string,
    conversion string
);
SQL

def test(num)
    db = SQLite3::Database.new "test.db"
    puts "the num: #{num}"
    sleep 4
    { num => num + 10}.each do |pair|
        db.execute "insert into test_table values (?, ?)", pair
    end
    db.close
end

Parallel.each( -> { arr.pop || Parallel::Stop}, in_processes: 3) { |number| test(number) }

1 个答案:

答案 0 :(得分:1)

默认情况下,SQLite是线程安全的(使用&#34;序列化&#34;模式),ruby包装器显然支持它所需的任何程度。但是,它在进程之间并不安全,这是有道理的,因为适配器或引擎可能必须在进程中协商某些状态以防止锁定。

将您的示例更改in_processes修改为in_threads