У меня есть метод, который часто вызывается от разных пользователей, поэтому я хочу смоделировать это поведение, чтобы наблюдать его поведение
Я читал о fork
и threads
и на самом деле думаю, что fork
лучше подходит для этой цели, но я ничего не смог найти с fork
, поэтому я переключаюсь на threads
, и я получил это :
module MethodBenchmark
extend self
def execute_with_threads
arr = []
3.times do |i|
arr[i] = Thread.new {
puts "Thread number #{i}"
call_actual_method(3)
}
end
arr.each {|t| t.join;}
end
def call_actual_method(number_of_requests)
number_of_requests.times do |i|
puts "Executing request #{i}"
end
end
end
результат, который я получил
Thread number 2
Executing request 0
Executing request 1
Executing request 2
Thread number 0
Executing request 0
Executing request 1
Executing request 2
Thread number 1
Executing request 0
Executing request 1
Executing request 2
Итак, я хочу, чтобы каждый поток представлял отдельного пользователя и каждый запрос, хорошо, чтобы представлять новый запрос от случайного пользователя. Другими словами, я хотел бы получить что-то вроде этого:
Thread number 2
Executing request 0
Executing request 1
Thread number 0
Executing request 2
Executing request 0
Executing request 1
Thread number 1
Executing request 2
Executing request 0
Executing request 1
Executing request 2
Идея состоит в том, что, как только все потоки будут порождены, я получу много параллельных запросов от разных потоков, а не этот последовательный вывод. Как мне добиться этого поведения?
P.S
Я надеялся, что это может быть связано с небольшим количеством потоков / запросов, но я получил такой же последовательный результат с 25 потоками и 100 запросами на поток.
PS.PS
Внутри тела этого метода
def call_actual_method (number_of_requests)
Я планирую на самом деле вызвать метод, который делает запрос к базе данных
def call_actual_method (number_of_requests)
number_of_requests.times do | i |
method_to_call_database ()
конец
конец
В настоящее время method_to_call_database()
имеет две возможные реализации с точки зрения структуры SQL
, и я хочу измерить время выполнения обеих реализаций при данной нагрузке. Идея состоит в том, чтобы выбрать более быстрый метод.