Skip to content

Instantly share code, notes, and snippets.

@kyanny
Last active December 17, 2015 12:49
Show Gist options
  • Save kyanny/5612718 to your computer and use it in GitHub Desktop.
Save kyanny/5612718 to your computer and use it in GitHub Desktop.
シングルスレッドサーバー、マルチスレッドサーバー、 EventMachine (Reactor パターン) + EM.defer による非同期処理サーバー
require 'eventmachine'
class DB
class << self
def connect
sleep 1
end
def query
sleep 3
end
def disconnect
sleep 1
end
end
end
class Server < EM::Connection
def receive_data(data)
p '==>'
EM.defer do
DB.connect
p data
DB.query
DB.disconnect
end
p '=='
end
end
Signal.trap(:INT) do
EM.stop_event_loop
raise
end
EM.run do
p 'Server boot localhost:9999'
EM.start_server("localhost", 9999, Server)
end
#!/usr/bin/env ruby
n = (ARGV.shift || 1).to_i
ts = []
n.times do |i|
ts << Thread.new(i) do |i|
cmd = "echo #{i} | nc localhost 9999"
puts cmd
system cmd
end
end
ts.each(&:join)
require 'socket'
class DB
class << self
def connect
sleep 1
end
def query
sleep 3
end
def disconnect
sleep 1
end
end
end
p 'Server boot localhost:9999'
Socket.tcp_server_loop(9999) { |sock, _|
p '==>'
begin
DB.connect
p sock.gets
DB.query
DB.disconnect
ensure
sock.close
end
p '=='
}
require 'socket'
class DB
class << self
def connect
sleep 1
end
def query
sleep 3
end
def disconnect
sleep 1
end
end
end
p 'Server boot localhost:9999'
Socket.tcp_server_loop(9999) { |sock, _|
p '==>'
Thread.new(sock) do |sock|
begin
DB.connect
p sock.gets
DB.query
DB.disconnect
ensure
sock.close
end
end
p '=='
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment