From de92a1ea6c283527dcecf0af0ff62485a91d7505 Mon Sep 17 00:00:00 2001 From: Mair Date: Sat, 22 Mar 2025 16:55:29 +0400 Subject: [PATCH 1/3] added async --- client.rb | 88 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/client.rb b/client.rb index e001ba3..fbf8399 100644 --- a/client.rb +++ b/client.rb @@ -1,5 +1,8 @@ require 'openssl' require 'faraday' +require 'async' +require 'async/barrier' +require 'async/semaphore' OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE @@ -36,43 +39,52 @@ def collect_sorted(arr) arr.sort.join('-') end -start = Time.now - -a11 = a(11) -a12 = a(12) -a13 = a(13) -b1 = b(1) - -ab1 = "#{collect_sorted([a11, a12, a13])}-#{b1}" -puts "AB1 = #{ab1}" - -c1 = c(ab1) -puts "C1 = #{c1}" - -a21 = a(21) -a22 = a(22) -a23 = a(23) -b2 = b(2) - -ab2 = "#{collect_sorted([a21, a22, a23])}-#{b2}" -puts "AB2 = #{ab2}" +# Создаём семафоры для ограничения параллельных запросов +SEMAPHORE_A = Async::Semaphore.new(3) # максимум 3 одновременных запроса типа A +SEMAPHORE_B = Async::Semaphore.new(2) # ма ксимум 2 одновременных запроса типа B +SEMAPHORE_C = Async::Semaphore.new(1) # максимум 1 запрос типа C +VALID_RESULT = "0bbe9ecf251ef4131dd43e1600742cfb" +VALID_DURATION = 7 -c2 = c(ab2) -puts "C2 = #{c2}" - -a31 = a(31) -a32 = a(32) -a33 = a(33) -b3 = b(3) - -ab3 = "#{collect_sorted([a31, a32, a33])}-#{b3}" -puts "AB3 = #{ab3}" - -c3 = c(ab3) -puts "C3 = #{c3}" - -c123 = collect_sorted([c1, c2, c3]) -result = a(c123) +start = Time.now +result = Sync do + ab1 = Async do + a11 = SEMAPHORE_A.async{ a(11) } + a12 = SEMAPHORE_A.async{ a(12) } + a13 = SEMAPHORE_A.async{ a(13) } + b1 = SEMAPHORE_B.async{ b(1) } + + "#{collect_sorted([a11.wait, a12.wait, a13.wait])}-#{b1.wait}" + end + + ab2 = Async do + a21 = SEMAPHORE_A.async{ a(21) } + a22 = SEMAPHORE_A.async{ a(22) } + a23 = SEMAPHORE_A.async{ a(23) } + b2 = SEMAPHORE_B.async{ b(2) } + "#{collect_sorted([a21.wait, a22.wait, a23.wait])}-#{b2.wait}" + end + + ab3 = Async do + a31 = SEMAPHORE_A.async{ a(31) } + a32 = SEMAPHORE_A.async{ a(32) } + a33 = SEMAPHORE_A.async{ a(33) } + b3 = SEMAPHORE_B.async{ b(3) } + "#{collect_sorted([a31.wait, a32.wait, a33.wait])}-#{b3.wait}" + end + + c123 = Async do + c1 = SEMAPHORE_C.async{ c(ab1.wait) } + c2 = SEMAPHORE_C.async{ c(ab2.wait) } + c3 = SEMAPHORE_C.async{ c(ab3.wait) } + collect_sorted([c1.wait, c2.wait, c3.wait]) + end.wait + + a(c123) +end -puts "FINISHED in #{Time.now - start}s." -puts "RESULT = #{result}" # 0bbe9ecf251ef4131dd43e1600742cfb +total_time = Time.now - start +puts "FINISHED in #{total_time}s." +puts "VALID DURATION: #{total_time < VALID_DURATION}" +puts "RESULT = #{result}" +puts "VALID: #{result==VALID_RESULT}" From 7ced8065f3d797f50f76833916cf44e8ce78a5ec Mon Sep 17 00:00:00 2001 From: Mair Date: Sat, 22 Mar 2025 17:03:53 +0400 Subject: [PATCH 2/3] added async --- client.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client.rb b/client.rb index fbf8399..b557e98 100644 --- a/client.rb +++ b/client.rb @@ -78,9 +78,9 @@ def collect_sorted(arr) c2 = SEMAPHORE_C.async{ c(ab2.wait) } c3 = SEMAPHORE_C.async{ c(ab3.wait) } collect_sorted([c1.wait, c2.wait, c3.wait]) - end.wait + end - a(c123) + a(c123.wait) end total_time = Time.now - start From 6edf39c401965f5c4852adeb31fcc12872fbfb14 Mon Sep 17 00:00:00 2001 From: Mair Date: Sat, 22 Mar 2025 17:19:33 +0400 Subject: [PATCH 3/3] refactoring --- client.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/client.rb b/client.rb index b557e98..2fb2aa2 100644 --- a/client.rb +++ b/client.rb @@ -1,7 +1,6 @@ require 'openssl' require 'faraday' require 'async' -require 'async/barrier' require 'async/semaphore' OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE @@ -43,33 +42,35 @@ def collect_sorted(arr) SEMAPHORE_A = Async::Semaphore.new(3) # максимум 3 одновременных запроса типа A SEMAPHORE_B = Async::Semaphore.new(2) # ма ксимум 2 одновременных запроса типа B SEMAPHORE_C = Async::Semaphore.new(1) # максимум 1 запрос типа C -VALID_RESULT = "0bbe9ecf251ef4131dd43e1600742cfb" -VALID_DURATION = 7 +EXPECTED_HASH = "0bbe9ecf251ef4131dd43e1600742cfb" +MAX_EXECUTION_TIME = 7 start = Time.now result = Sync do ab1 = Async do + b1 = SEMAPHORE_B.async{ b(1) } # так как запросы B выполняются дольше (2 секунды), + # их нужно запускать первыми, чтобы они начали выполняться как можно раньше + # и не блокировали остальные операции в конце a11 = SEMAPHORE_A.async{ a(11) } a12 = SEMAPHORE_A.async{ a(12) } a13 = SEMAPHORE_A.async{ a(13) } - b1 = SEMAPHORE_B.async{ b(1) } "#{collect_sorted([a11.wait, a12.wait, a13.wait])}-#{b1.wait}" end ab2 = Async do + b2 = SEMAPHORE_B.async{ b(2) } a21 = SEMAPHORE_A.async{ a(21) } a22 = SEMAPHORE_A.async{ a(22) } a23 = SEMAPHORE_A.async{ a(23) } - b2 = SEMAPHORE_B.async{ b(2) } "#{collect_sorted([a21.wait, a22.wait, a23.wait])}-#{b2.wait}" end ab3 = Async do + b3 = SEMAPHORE_B.async{ b(3) } a31 = SEMAPHORE_A.async{ a(31) } a32 = SEMAPHORE_A.async{ a(32) } a33 = SEMAPHORE_A.async{ a(33) } - b3 = SEMAPHORE_B.async{ b(3) } "#{collect_sorted([a31.wait, a32.wait, a33.wait])}-#{b3.wait}" end @@ -85,6 +86,6 @@ def collect_sorted(arr) total_time = Time.now - start puts "FINISHED in #{total_time}s." -puts "VALID DURATION: #{total_time < VALID_DURATION}" +puts "VALID DURATION: #{total_time < MAX_EXECUTION_TIME}" puts "RESULT = #{result}" -puts "VALID: #{result==VALID_RESULT}" +puts "VALID RESULT: #{result==EXPECTED_HASH}"