Sha256: 20ba26fb8db019f33940b35352a41d920f6e73c7bc321e8171cbd914fba4ef88
Contents?: true
Size: 1.15 KB
Versions: 1
Compression:
Stored size: 1.15 KB
Contents
# frozen_string_literal: true require 'bundler/setup' require 'polyphony' require 'http/parser' $connection_count = 0 def handle_client(socket) $connection_count += 1 parser = Http::Parser.new reqs = [] parser.on_message_complete = proc do |env| reqs << Object.new # parser end while (data = socket.readpartial(8192)) do parser << data while (req = reqs.shift) handle_request(socket, req) req = nil snooze end end rescue IOError, SystemCallError => e # do nothing ensure $connection_count -= 1 socket&.close end def handle_request(client, parser) status_code = "200 OK" data = "Hello world!\n" headers = "Content-Type: text/plain\r\nContent-Length: #{data.bytesize}\r\n" client.write "HTTP/1.1 #{status_code}\r\n#{headers}\r\n#{data}" end spin do server = TCPServer.open('0.0.0.0', 1234) puts "listening on port 1234" loop do client = server.accept spin { handle_client(client) } end ensure server&.close end # every(1) { # stats = Thread.current.fiber_scheduling_stats # stats[:connection_count] = $connection_count # puts "#{Time.now} #{stats}" # } puts "pid #{Process.pid}" suspend
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
polyphony-0.41 | examples/performance/thread-vs-fiber/polyphony_server.rb |