MongoDB Ruby 驱动程序 - “同步”:无法从陷阱上下文调用

2024-04-18

我试图使用 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 不允许在陷阱上下文中进行互斥同步,大概是因为它可能导致死锁(即,您处于同步上下文中,然后向进程发送信号并尝试重新同步,从而导致死锁)。您可以通过以下方式简单地重现这一点:

# 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!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB Ruby 驱动程序 - “同步”:无法从陷阱上下文调用 的相关文章

  • ruby 1.9 如何将数组转换为不带括号的字符串

    我的问题是关于如何在 ruby 1 9 中将数组元素转换为字符串而不需要括号和引号 我有一个数组 数据库提取 我想用它来创建定期报告 myArray Apple Pear Banana 2 15 12 在 ruby 1 8 中我有以下行 r
  • 如何默认选中collection_check_boxes?

    我试图默认选中这一行 In db t text committed 我尝试过的变体checked true 但也许我忽略了一些事情 这是Gist http gist github com RallyWithGalli c66dee6dfb9
  • 设置 put 的行尾字符

    我有一系列想要打印的条目 Being arr数组 我只是用来写 puts arr 然后我需要使用DOS格式的行尾 r n 所以我写道 arr each e print e r n 这工作正常 但我想知道是否有一种方法可以指定要使用的行尾格式
  • 从命令行将绑定或参数传递给 ERB

    我最近一直在从命令行使用 erb 我想制作一个非常简单的 erb 模板 例如以下内容 Hello My name is I hope your day is 如果我跑的话这有效 erb T thatfile erb 我想做的是name an
  • Mongoose Date.now 时间不准确

    在过去的两个小时里 我一直在抓狂 起初我以为 Moment js 是没有返回正确时间的罪魁祸首 但其实是 mongoose Date now 做了一些邪恶的事情 这是代码 const moment require moment const
  • 如何在ubuntu中安装c++的mongodb驱动?

    我想使用 c for mongoDB 开发一个相当简单的应用程序 我遵循他们的教程 http www mongodb org pages viewpage action pageId 133415 http www mongodb org
  • MongoDB 中的游标是什么?

    我们对最终发生的事情感到困扰cursor not found exceptions对于一些 Morphia 查询asList http mongodb github io morphia 1 0 guides querying 我找到了一个
  • NodeJS + Express + Mongo 会话存储

    我目前在尝试在 MongoDb 中存储会话时遇到了很大的麻烦 我尝试过express session mongo和connect mongodb 当我尝试加载登录页面时 两者都给出了相同的 500内部服务器错误 这让我觉得也许在某个地方与
  • 在猫鼬的整个应用程序中共享数据库连接

    使用最新的 mongoose 更新 您不能再像我以前那样进行用户建模 我需要在整个应用程序中共享相同的数据库连接 https github com LearnBoost mongoose issues 1249 https github c
  • Spring Data Mongo 无法找到 Enum 的 PersistentEntity

    编辑 我发现了一个相关问题here https stackoverflow com questions 28972455 does spring data mongodb support enums 但仅有的两个答案相互矛盾 并且没有足够的
  • '||=' 运算符在 ruby​​ 中起什么作用? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Ruby 中是什么意思 https stackoverflow com questions 995593 what does mean in ruby 我是红宝石新手 我看到这里的答案之一使用了它
  • Mongo Facet 聚合与 Sum

    试图在这个聚合中找出一些简单的东西 元数据下的 totalArrests 字段返回 0 由于某种原因 无法对前一阶段的该字段求和 请指教 const agg await KID aggregate group id source group
  • 在 mongodb shell 中打印文档值

    我想在 mongo shell 中打印此 JSON 文档的值 就像简单的控制台输出一样 无需创建新的集合或文档 提前致谢 我找到了一个解决方案 通过使用 forEach 应用 JavaScript 方法 db widget find id
  • 类型错误:无法读取未定义的属性“_id”

    我在将文档保存到名为的集合的简单发布请求中收到错误 TypeError 无法读取未定义的属性 id books 我的有效负载如下所示 name practical view author DN location room 50 而我只是在做
  • 如何获得“irb(main):001:0>”提示而不是“>>”

    我的 Mac 上预装了 Ruby 所以我想看看它 我注意到的第一件事是 irb 提示 gt gt 而不是 irb main 001 0 gt 我找不到任何关于如何通过 Google 更改此设置的信息 因为每个人都在其代码中使用 irb ma
  • 使用正则表达式惰性(不贪婪)匹配多个组

    我想获取成对之间任何值的内容
  • 从现有 MongoDB 创建可视化的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我接手了一个现有 MongoDB 的项目 我想获得现有数据的视觉图像 图表等 显然 MongoDB 与
  • Mongo聚合查询结果在较少的文档中排序

    我在查询我们的一个馆藏时遇到了一个奇怪的问题将结果聚合到另一个集合中 https stackoverflow com a 25936760 1746118 我正在查询已执行某些操作的唯一用户 并在聚合查询中预测每个用户执行的操作计数 var
  • 嵌套过滤器:$filter 数组,然后是 $filter 子数组

    本质上 我试图过滤掉已被 废弃 的子文档和子子文档 这是我的架构的精简版本 permitSchema id name feeClassifications new Schema id trashed name fees new Schema
  • 将 $lookup 结果合并到现有数组

    我是 mongo 新手 我需要你的帮助 我有收藏学习计划 这是示例文档 id dGFY garranti typ sk garant en Chairman of study board id 1025769 typ sk predseda

随机推荐