Я пытаюсь написать подключение к серверу в 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, чтобы справиться с одним из них?
И, наконец, кто-нибудь рекомендует хороший ресурс, который поможет объяснить более сложные рубиновые потоки? Я нашел много простых экземпляров, но, очевидно, у меня все еще много путаницы.
Спасибо за помощь!
Попробуйте добавить 'Thread.abort_on_exception = true' в начало вашего файла. Кроме того, '@ socket' действительно является сервером, а' server' действительно является сокетом. :) – Adrian
Хмм, я не знал о 'eventmachine'. :) Кроме того, я попробую предложение Адриана. – Magicked