2010-07-23 3 views
2

Я пытаюсь написать подключение к серверу в Ruby, которое создаст поток для обработки входящих соединений. Затем этот поток будет интерпретировать входящие данные, а затем поместить некоторые инструкции в очередь, которые будут обрабатываться основным программным циклом, по своему усмотрению. Однако у меня, похоже, есть некоторые проблемы с обработкой очереди, поскольку программа, похоже, либо блокируется где-то, либо основной цикл просто перестает работать неожиданно. Это довольно трудно объяснить так, здесь является методом прослушивания моего сокета сервера:Ruby: Threading и socket

def listen 
    @socket = TCPServer.open(@ip, @port) 

    while @looping do 
    puts "Waiting for socket accept" 
    server = @socket.accept 
    puts "Socket accepted" 
    serverloop = Thread.new do 
     puts "Waiting for response" 
     response = server.read 
     puts "Command received: #{response}" 
     parse_command(response) 
     puts "Response complete" 
    end 
    processloop = Thread.new do 
     while @looping do 
     process_command_queue 
     process_response_queue 
     end 
    end 
    if interrupted 
     exit 
    end 
    end 
end 

def process_command_queue 
    puts "In the command queue" 
    if @command_queue.length > 0 
    @command = @queue.pop 
    @command.process 
    end 
end 

Когда соединение установлено, здесь есть выход:

magicked$ ./server.rb 
Waiting for socket accept 
Socket accepted 
Waiting for response 
In the command queue 
In the command queue ... (repeats) 
Waiting for socket accept 
In the command queue 
In the command queue ... (repeats a lot) 
Command received: EXEC 1 1 thisisacommand 
Command initialized: EXEC 1 1 thisisacommand 
Response complete 

После этого, он делает паузу снова и жду для другого соединения/команды. Я ожидал увидеть, что «В очереди команд» продолжает повторяться.

Я, вероятно, не полностью обернул голову вокруг того, как работают рубиновые нити. Я знаю, что экземпляр интерпретатора ruby ​​имеет ограничения при выполнении нескольких потоков. То же самое происходит и в том, что цикл снова попадает в @ socket.accept и блокирует другие команды, ожидая другого соединения? Является ли моя первая нить завершающей и присоединяющейся к основному потоку, заставляя второй поток делать то же самое? Нужно ли мне перекручивать другой интерпретатор ruby, чтобы справиться с одним из них?

И, наконец, кто-нибудь рекомендует хороший ресурс, который поможет объяснить более сложные рубиновые потоки? Я нашел много простых экземпляров, но, очевидно, у меня все еще много путаницы.

Спасибо за помощь!

+0

Попробуйте добавить 'Thread.abort_on_exception = true' в начало вашего файла. Кроме того, '@ socket' действительно является сервером, а' server' действительно является сокетом. :) – Adrian

+0

Хмм, я не знал о 'eventmachine'. :) Кроме того, я попробую предложение Адриана. – Magicked

ответ

0

Вы должны использовать eventmachine.

+0

'evenmachine' ->' eventmachine'? – Adrian

+0

@Adrian: да, спасибо, и спасибо theIV за редактирование. –

Смежные вопросы