Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 运行时错误:can';在迭代过程中,不要将新密钥添加到哈希中_Ruby On Rails - Fatal编程技术网

Ruby on rails 运行时错误:can';在迭代过程中,不要将新密钥添加到哈希中

Ruby on rails 运行时错误:can';在迭代过程中,不要将新密钥添加到哈希中,ruby-on-rails,Ruby On Rails,我在rails应用程序中遇到了很多运行时错误:在迭代过程中无法将新键添加到哈希中错误,但是堆栈跟踪没有指向任何有趣的地方 任何提示都将不胜感激[添加锁以使共享哈希线程安全] 我遇到了非常类似的问题,问题是一个线程试图修改共享对象(哈希),而其他线程正在迭代它。 最后,我通过添加锁(互斥)和使用own来解决这个问题 [检查所有线程回溯,以找到谁拥有/迭代您的哈希] 尝试修改“忙”散列时得到的堆栈跟踪的问题是,它向您显示了一系列函数,一直到您尝试修改散列的位置,但它没有显示当前并行迭代它的人(谁拥

我在rails应用程序中遇到了很多
运行时错误:在迭代过程中无法将新键添加到哈希中
错误,但是堆栈跟踪没有指向任何有趣的地方


任何提示都将不胜感激

[添加锁以使共享哈希线程安全]
我遇到了非常类似的问题,问题是一个线程试图修改共享对象(哈希),而其他线程正在迭代它。 最后,我通过添加锁(互斥)和使用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)您实际拥有的线程数(与您认为拥有的线程数相比——通常这两个数字是不同的;)


另请参见:

您搜索过类似的问题吗?当然,它们都源于用户代码,而在我的例子中,线程与我的代码无关。一定是有缺陷的宝石?