- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试在使用 random-word gem 的 Rails 应用程序中编写一个小功能生成一个随机名词,然后将其复数。第一次访问开发中的页面时,我已经能够让它工作,但我希望脚本在每次加载页面时再次运行。现在,后续页面加载(直到我反弹服务器)给我 WelcomeController#randomwords 中的 FiberError
,fiber called across threads
。我试图自己解决这个问题,但我对编程还很陌生,并不真正了解 Fibers 的工作原理。我尝试使用 Queue,但无法弄清楚如何让它工作,同样是因为我不完全理解该类(class)。我将如何着手解决这个具体问题?
来源:welcome_helper.rb
def random
noun = RandomWord.nouns.next.split('_').sample.pluralize
if noun.include? "_"
noun = noun.split("_").join.pluralize
else
noun.pluralize!
end
return noun
end
最佳答案
您现在可能已经发现,问题是 random-word
gem 不是线程安全的。更准确地说,RandomWord.nouns
是一个 module-level Enumerator , 和 accessing enumerators across threads is not safe
但是,例如Queue
是线程安全的,因此对于此功能的线程安全替代方案,您可以采用 nouns.dat
from the random-word gem ,并在您初始化应用程序时将其所有单词随机混入 Queue
对象。现在,假设可以在 random
方法的范围内通过 random_words_queue
访问此队列。然后你可以将 random
方法实现为
def random
unless random_words_queue.empty?
noun = random_words_queue.pop
if noun.include? "_"
noun = noun.split("_").join.pluralize
else
noun.pluralize!
end
return noun
end
end
请注意,如果队列为空,它目前只返回 nil
,这可能是您不希望的。在这种情况下,您希望它如何表现取决于您的要求:
noun
弹出后立即将其推到队列的后面。(无论如何,返回 nil
可能不是任何人想要的。)
关于ruby-on-rails - FiberError - 跨线程调用的纤程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28951261/
我是一名优秀的程序员,十分优秀!