Я пытаюсь написать соединение с сервером в Ruby, которое будет порождать поток для обработки входящих соединений. Затем этот поток будет интерпретировать поступающие данные, а затем помещать некоторые инструкции в очередь, которая будет обработана главным программным циклом для удобства. Однако у меня, похоже, есть некоторые проблемы с обработкой очереди, так как программа, кажется, либо блокируется где-то, либо основной цикл неожиданно перестает работать. Это довольно сложно объяснить, вот метод прослушивания для моего сокета сервера:
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 для обработки одного из них?
Наконец, кто-нибудь рекомендует хороший ресурс, который поможет объяснить более продвинутые потоки ruby? Я нашел много простых примеров, но, очевидно, у меня все еще много путаницы.
Спасибо за помощь!