Ruby on rails 运行时错误:can';在迭代过程中,不要将新密钥添加到哈希中
我在rails应用程序中遇到了很多Ruby on rails 运行时错误:can';在迭代过程中,不要将新密钥添加到哈希中,ruby-on-rails,Ruby On Rails,我在rails应用程序中遇到了很多运行时错误:在迭代过程中无法将新键添加到哈希中错误,但是堆栈跟踪没有指向任何有趣的地方 任何提示都将不胜感激[添加锁以使共享哈希线程安全] 我遇到了非常类似的问题,问题是一个线程试图修改共享对象(哈希),而其他线程正在迭代它。 最后,我通过添加锁(互斥)和使用own来解决这个问题 [检查所有线程回溯,以找到谁拥有/迭代您的哈希] 尝试修改“忙”散列时得到的堆栈跟踪的问题是,它向您显示了一系列函数,一直到您尝试修改散列的位置,但它没有显示当前并行迭代它的人(谁拥
运行时错误:在迭代过程中无法将新键添加到哈希中错误,但是堆栈跟踪没有指向任何有趣的地方
任何提示都将不胜感激[添加锁以使共享哈希线程安全]
我遇到了非常类似的问题,问题是一个线程试图修改共享对象(哈希),而其他线程正在迭代它。
最后,我通过添加锁(互斥)和使用own来解决这个问题
[检查所有线程回溯,以找到谁拥有/迭代您的哈希]
尝试修改“忙”散列时得到的堆栈跟踪的问题是,它向您显示了一系列函数,一直到您尝试修改散列的位置,但它没有显示当前并行迭代它的人(谁拥有它)!但是我找到了一种方法,通过打印当前运行的所有线程的堆栈跟踪来解决这个问题。以下是您如何做到这一点:
# This solution was found in comment by @thedarkone on https://github.com/rails/rails/issues/24627
rescue Object => boom
# only for your particular exception:
if boom.message == "can't add a new key into hash during iteration"
thread_count = 0
Thread.list.each do |t|
thread_count += 1
err_msg += "--- thread #{thread_count} of total #{Thread.list.size} #{t.object_id} backtrace begin \n"
# Lets see if we are able to pin down the culprit
# by collecting backtrace for all existing threads:
err_msg += t.backtrace.join("\n")
err_msg += "\n---thread #{thread_count} of total #{Thread.list.size} #{t.object_id} backtrace end \n"
end
# and just print it somewhere you like:
$stderr.puts(err_msg)
raise # always reraise
end
上面的代码片段即使只是出于教育目的也很有用,因为它可以向您显示(如x-ray)您实际拥有的线程数(与您认为拥有的线程数相比——通常这两个数字是不同的;)
另请参见:您搜索过类似的问题吗?当然,它们都源于用户代码,而在我的例子中,线程与我的代码无关。一定是有缺陷的宝石?