スレッド化されたサーバー (現在 MRI で実行中) のソケットに書き込みを行っています。次のコードでそれを行います:
begin
num_bytes_written = socket.write_nonblock(chunk)
if num_bytes_written < chunk.bytesize
chunk = chunk[num_bytes_written..-1]
raise Errno::EINTR
end
rescue IO::WaitWritable, Errno::EINTR
Thread.pass if server_is_threaded
IO.select(nil, [socket])
retry
rescue Errno::EPIPE
return
end
その要点は、WaitWritable を取得した場合 (ソケットが飽和している場合)、これを実行するサーバーに別のスレッドを先取りさせたいということです。ここで良い考えですかThread.pass
、または私のスレッドが実行している場合、MRI は自動的に何か他のものをプリエンプトしますselect()
か?