从昨天开始,我一直试图让我的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) }
答案 0 :(得分:1)
默认情况下,SQLite是线程安全的(使用&#34;序列化&#34;模式),ruby包装器显然支持它所需的任何程度。但是,它在进程之间并不安全,这是有道理的,因为适配器或引擎可能必须在进程中协商某些状态以防止锁定。
将您的示例更改in_processes
修改为in_threads