Нити Ruby нельзя использовать в RubyCocoa без исправлений для интерпретатора Ruby. - PullRequest
2 голосов
/ 14 ноября 2009

Я обнаружил эту ошибку в консоли Ruby во время тестирования приложения Rails.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib /mongrel.rb:285:  
in `run': Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter

Так что, я думаю, мне нужно исправить или переустановить RubyCocoa. Но я не нашел никакого контента для этого. или у вас может быть лучший способ решить эту проблему?

Это моя среда:

  • Рубин 1.8.7
  • Рельсы 2.3.3
  • Mac OSX 10,6

Ответы [ 3 ]

2 голосов
/ 15 февраля 2010

Быстрый взлом:

$ RUBYCOCOA_THREAD_HOOK_DISABLE=1 ./script/server --debugger

Отличный быстрый взлом:

$ echo "ENV['RUBYCOCOA_THREAD_HOOK_DISABLE']='1'" > config/initializers/disable_rubycocoa_warning.rb
2 голосов
/ 28 января 2010

Как указывает Мэтью в своем ответе, причиной может быть плагин. Он обнаружил, что attachment_fu является одной из причин. (Он может использовать Core Image для обработки изображений.) Создание файла в config/initializers (для приложения Rails) с этой строкой отключит предупреждение, за счет необходимости использования одного из других процессоров изображений:

Technoweenie::AttachmentFu.default_processors.delete('CoreImage')

Это не проблема для меня; Я выполняю развертывание на серверах, отличных от Mac, и поскольку они не могут использовать CoreImage, я в любом случае хочу запустить то же самое во время разработки.

Если вы посмотрите на /System/Library/Frameworks/RubyCocoa.framework/Versions/A/Resources/ruby/osx/ objc/ruby_addition.rb, это внизу файла:

class Thread
  class << self
    alias :pre_rubycocoa_new :new

    # Override Thread.new to prevent threads being created if there isn't 
    # runtime support for it
    def new(*args,&block)
      unless defined? @_rubycocoa_threads_allowed then
        # If user has explicilty disabled thread support, also disable the 
        # check (for debugging/testing only)
        @_rubycocoa_threads_allowed = ENV['RUBYCOCOA_THREAD_HOOK_DISABLE'] || 
          OSX::RBRuntime.isRubyThreadingSupported?
      end
      if !@_rubycocoa_threads_allowed then
        warn "#{caller[0]}: Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter"
      end
      pre_rubycocoa_new(*args,&block)
    end
  end
end

Итак, для начала мы получаем предупреждение, но затем он продолжает называть оригинал Thread.new в любом случае. Я не верю, что это предупреждение является реальной проблемой. Просто раздражает постоянно видеть это в консоли.

Если вы хотите отследить, что тянет в патче обезьяны, до Thread, grep для чего-то, что вытягивает osx/cocoa:

$ irb
>> Thread.new { puts 'hi' }
hi=> #<Thread:0x1011328e0 run>
>> require 'osx/cocoa'

=> true
>> Thread.new { puts 'hi' }
(irb):3:in `irb_binding': Ruby threads cannot be used in RubyCocoa without patches to the Ruby interpreter
hi=> #<Thread:0x103bf76e8 run>
1 голос
/ 30 января 2010

Возможно, это не монгрел, а какой-то плагин в вашем приложении rails. Для меня attachment_fu был виновником

...