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 такой проблемы нет. Итак, я собрал пошаговое руководство по выявлению и воспроизведению проблемы:
test.rb
с кодом из моего примера и запустите его.Попробуйте изменить размер окна - вы увидите ужасные лаги. Удалите поток из кода, запустите и попробуйте изменить размер окна - лаги исчезли. Я записал видео этого теста . Команды компиляции Ruby:
./configure --with-arch=x86_64,i386 --enable-pthread --enable-shared --with-gcc=clang --prefix=/usr
make
sudo make install