升级到OS10.14后,使用时出现此错误 Httparty
response = HTTParty.get('http://api.stackexchange.com/2.2/questions?site=stackoverflow')
objc[4182]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[4182]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
Run Code Online (Sandbox Code Playgroud)
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES在启动Rails控制台之前,我已经尝试
过了。
但这没有用。
小智 39
Ruby 错误跟踪系统上有一个关于此问题的线程!
https://bugs.ruby-lang.org/issues/14009
基本上......正如您可能已经知道的那样,在多线程环境中分叉(但没有执行)本质上是危险的,必须仔细编写环境以支持这样的事情。Apple 的 Objective-C 库传统上根本不支持在分叉(但不是 exec'd)子进程中调用,但自 High Sierra 10.13 以来,他们试图为此添加有限的支持。然而,在这样做的过程中,他们还定义了分叉后不允许的规则。规则之一是不允许在fork后调用某些Objective-C类的初始化函数;这可能只发生在分叉之前。
到目前为止是有道理的。出现问题的原因是三件事的组合:
Ruby 本身没有链接到任何Objective-C 库,因此它本身不会初始化Objective-C 类。用户可以使用链接到 Objective-C 库的 gem。由于这些 gem 的使用方式,这些 gem 可能会在应用服务器分叉后调用 Objective-C 初始值设定项。新的 Apple 强制规则检查然后中止该过程并显示如下警告:
objc[81924]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[81924]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
Run Code Online (Sandbox Code Playgroud)
就其本身而言,Apple 的错误检查是有道理的。分叉是危险的。但所有这些因素加在一起就没有意义了。在 Ruby 中添加一个解决方法(以确保在分叉之前调用 Objective-C 初始化程序的形式)至少将确保我们返回到 High Sierra 之前的行为。
线程中有很多解决方案,您将需要特定于您的环境/已安装 gem 的解决方案。
对我有用的是 export DISABLE_SPRING=true
小智 16
在Rails控制台之前运行替代方法命令还不够。
以下解决方案对我有用(按照此说明进行操作):
如果遇到此错误,可以将以下代码添加到位于主目录中的.bash_profile中,以解决此问题。
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
Run Code Online (Sandbox Code Playgroud)
*这很重要* 在我的情况下,进入.bash_profile的过程是这样的:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM$
Run Code Online (Sandbox Code Playgroud)
保存文件并退出所有编辑器和终端会话。重新打开您的编辑器,一切现在应该正常工作。
我在此链接Kody Clemens个人博客中找到了该解决方案
我在OS Mojave和Windows上遇到此问题ruby-2.4.0。我通过升级到使其工作ruby-2.4.4。我也在这里发布了答案。具有gem ruby-oci8的Oracle Instant Client无法与Rails中的DB连接
简单地在终端中运行它:
export DISABLE_SPRING=true
Run Code Online (Sandbox Code Playgroud)
或者为了永久修复,请将以上内容添加到~/.zshrc
| 归档时间: |
|
| 查看次数: |
2815 次 |
| 最近记录: |