Почему GUI Ruby 1.9 зависает, если я выполняю какие-либо интенсивные вычисления в отдельном потоке Ruby?

Ruby 1.9 должен иметь собственные потоки, а GIL должен подниматься, если некоторые потоки вводят собственный код (например, основной цикл инструментария GUI или реализация C некоторой библиотеки Ruby).

Но если я начну следовать простому образцу кода, который отображает графический интерфейс в основном потоке и проделаю базовые вычисления в отдельном потоке - графический интерфейс будет плохо зависать, попробуйте изменить размер окна, чтобы увидеть его самостоятельно. Я проверил с другим набором инструментов GUI, Qt (qtbindings gem) - он ведет себя точно так же. Протестировано с Ruby 1.9.3-p0 в Windows 7 и OSX 10.7

require 'tk'
require 'thread'
Thread.new { loop { a = 1 } }
TkRoot.new.mainloop()

Тот же код в Python отлично работает без зависаний графического интерфейса:

from Tkinter import *
from threading import *
class WorkThread( Thread ) :
  def run( self ) :
    while True :
      a = 1
WorkThread().start()
Tk().mainloop()

Что я делаю не так?

ОБНОВЛЕНИЕ

Кажется, где нет такая проблема на Ubuntu linux, поэтому мой вопрос в основном о Windows и OSX.

ОБНОВЛЕНИЕ

Некоторые люди отмечают, что в OSX такой проблемы нет. Итак, я собрал пошаговое руководство по выявлению и воспроизведению проблемы:

  1. Установите OSX 10.7 Lion с помощью функции «Восстановление». Для тестирования я использовал наш тестовый отдел MB139RS / A mac mini.
  2. Установить все обновления. Система будет выглядеть так: enter image description here
  3. Установите последнюю версию ActiveTcl с сайта activestate.com, в моем случае это ActiveTcl 8.5.11 для OSX.
  4. Загрузите и распакуйте последний исходный код Ruby. В моем случае это Ruby 1.9.3-p125. Скомпилируйте его и установите заменяющий системный Ruby (команды ниже). В итоге вы получите последнюю версию Ruby со встроенной поддержкой Tk: enter image description here
  5. Создайте файл test.rb с кодом из моего примера и запустите его.Попробуйте изменить размер окна - вы увидите ужасные лаги. Удалите поток из кода, запустите и попробуйте изменить размер окна - лаги исчезли. Я записал видео этого теста .

Команды компиляции Ruby:

./configure --with-arch=x86_64,i386 --enable-pthread --enable-shared --with-gcc=clang --prefix=/usr
make
sudo make install

17
задан Coren 14 March 2012 в 08:53
поделиться