gpt4 book ai didi

ruby - MongoDB Ruby 驱动程序 - `synchronize' : can't be called from trap context

转载 作者:行者123 更新时间:2023-12-05 03:13:57 25 4
gpt4 key购买 nike

我正在尝试使用 Kernel#trap 捕获信号,并在该上下文中运行数据库请求,但出现上述错误。以前有人遇到过吗?有什么解决办法吗?

示例代码:

trap('HUP') do
$db[:db_name].update({_id: 123}, {:$set => {a: 1}})
end

loop { sleep 1 }

会报错:

/usr/local/lib/ruby/gems/2.1.0/gems/mongo-1.11.1/lib/mongo/connection/pool.rb:266:in `synchronize': can't be called from trap context (ThreadError)

当脚本收到 HUP 信号时,可以通过运行 kill -HUP {pid} 发送。 $db 必须是一个 MongoDB 对象。

最佳答案

Ruby 不允许在陷阱上下文中进行 Mutex 同步,大概是因为它会导致死锁(即,您处于同步上下文中,然后向进程发送一个信号并尝试重新同步,此时您会死锁) .您可以通过以下方式轻松重现:

# trap.rb
require 'thread'
mutex = Mutex.new
trap('HUP') { mutex.synchronize {} }
gets

# pkill -HUP -f trap.rb

trap.rb:3:in `synchronize': can't be called from trap context (ThreadError)
from trap.rb:3:in `block in <main>'
from trap.rb:4:in `call'
from trap.rb:4:in `gets'
from trap.rb:4:in `gets'
from trap.rb:4:in `<main>'

要解决这个问题,您的信号处理程序可能应该将一个作业排队等待另一个线程处理,或者您可以生成一个新线程并在其中执行您的工作:

# trap.rb
require 'thread'
mutex = Mutex.new
trap('HUP') do
Thread.new { mutex.synchronize { puts "hi!" } }
end
gets

# pkill -HUP -f trap.rb
hi!

关于ruby - MongoDB Ruby 驱动程序 - `synchronize' : can't be called from trap context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28040555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com