Skip to content

Instantly share code, notes, and snippets.

@peagha
Created July 11, 2022 14:42
Show Gist options
  • Save peagha/2ba2a48f28c3fb5ecc8ba01493b614fc to your computer and use it in GitHub Desktop.
Save peagha/2ba2a48f28c3fb5ecc8ba01493b614fc to your computer and use it in GitHub Desktop.
require 'ruby2d'
require 'delegate'
set(
title: 'arch sim',
background: 'blue',
width: 1500,
height: 1300
)
$max_slow = 9
$slow_count = 0
$total_requests = 0
$total_slow_requests = 0
$failed_requests = 0
class Request < Delegator
def initialize
@circle = Circle.new(
x: Window.width / 2,
y: 0,
radius: [5, 2.5, 25].sample,
sectors: 128,
color: 'fuchsia'
)
end
def __getobj__
@circle
end
def cycles
self.radius * 20
end
end
class Worker < Delegator
def initialize(x:, y:)
@cycles = 0
@image = Image.new(
'cog.png',
x: x - 30,
y: y
)
end
def __getobj__
@image
end
def process_request(request)
return if request.nil?
return unless @request.nil?
if request.cycles == 500
$total_slow_requests += 1
end
if $slow_count >= $max_slow && request.cycles == 500
request.remove
$failed_requests += 1
return
end
if request.cycles == 500
$slow_count += 1
end
@request = request
@request.y = self.y
@request.x = self.x
end
def available?
@request.nil?
end
def new_cycle
return if @request.nil?
@cycles += 1
request_finished() if @cycles >= @request.cycles
end
def request_finished
if @request.cycles == 500
$slow_count -= 1
end
@request.remove
@request = nil
@cycles = 0
end
end
requests = []
threads = 15
workers = Array.new(threads) do |index|
Worker.new(
x: (Window.width / (threads.to_f + 1)) * (index + 1),
y: Window.height - 200
)
end
cycles = 0
threadsText = Text.new('', x: 30, y: 30)
update do
cycles += 1
# next if cycles < 300
if (cycles % 10 == 0)
requests.push(Request.new)
$total_requests += 1
end
requests.each do |request|
request.y += 6 if request.y < (Window.height - 300)
end
workers.each do |worker|
worker.new_cycle
worker.process_request(requests.shift) if worker.available?
end
threadsText.text = "Working: #{workers.reject {|worker| worker.available?}.size}, " \
"Free: #{workers.select {|worker| worker.available?}.size}, " \
"Enqueued: #{requests.size}, " \
"Total: #{$total_requests}, " \
"Total slow: #{$total_slow_requests}, " \
"Failed: #{$failed_requests}"
end
show
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment