|
1 | 1 | require 'openssl' |
2 | 2 | require 'faraday' |
| 3 | +require 'async' |
| 4 | +require 'async/barrier' |
| 5 | +require 'async/semaphore' |
3 | 6 |
|
4 | 7 | OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE |
5 | 8 |
|
@@ -36,43 +39,52 @@ def collect_sorted(arr) |
36 | 39 | arr.sort.join('-') |
37 | 40 | end |
38 | 41 |
|
39 | | -start = Time.now |
40 | | - |
41 | | -a11 = a(11) |
42 | | -a12 = a(12) |
43 | | -a13 = a(13) |
44 | | -b1 = b(1) |
45 | | - |
46 | | -ab1 = "#{collect_sorted([a11, a12, a13])}-#{b1}" |
47 | | -puts "AB1 = #{ab1}" |
48 | | - |
49 | | -c1 = c(ab1) |
50 | | -puts "C1 = #{c1}" |
51 | | - |
52 | | -a21 = a(21) |
53 | | -a22 = a(22) |
54 | | -a23 = a(23) |
55 | | -b2 = b(2) |
56 | | - |
57 | | -ab2 = "#{collect_sorted([a21, a22, a23])}-#{b2}" |
58 | | -puts "AB2 = #{ab2}" |
| 42 | +# Создаём семафоры для ограничения параллельных запросов |
| 43 | +SEMAPHORE_A = Async::Semaphore.new(3) # максимум 3 одновременных запроса типа A |
| 44 | +SEMAPHORE_B = Async::Semaphore.new(2) # ма ксимум 2 одновременных запроса типа B |
| 45 | +SEMAPHORE_C = Async::Semaphore.new(1) # максимум 1 запрос типа C |
| 46 | +VALID_RESULT = "0bbe9ecf251ef4131dd43e1600742cfb" |
| 47 | +VALID_DURATION = 7 |
59 | 48 |
|
60 | | -c2 = c(ab2) |
61 | | -puts "C2 = #{c2}" |
62 | | - |
63 | | -a31 = a(31) |
64 | | -a32 = a(32) |
65 | | -a33 = a(33) |
66 | | -b3 = b(3) |
67 | | - |
68 | | -ab3 = "#{collect_sorted([a31, a32, a33])}-#{b3}" |
69 | | -puts "AB3 = #{ab3}" |
70 | | - |
71 | | -c3 = c(ab3) |
72 | | -puts "C3 = #{c3}" |
73 | | - |
74 | | -c123 = collect_sorted([c1, c2, c3]) |
75 | | -result = a(c123) |
| 49 | +start = Time.now |
| 50 | +result = Sync do |
| 51 | + ab1 = Async do |
| 52 | + a11 = SEMAPHORE_A.async{ a(11) } |
| 53 | + a12 = SEMAPHORE_A.async{ a(12) } |
| 54 | + a13 = SEMAPHORE_A.async{ a(13) } |
| 55 | + b1 = SEMAPHORE_B.async{ b(1) } |
| 56 | + |
| 57 | + "#{collect_sorted([a11.wait, a12.wait, a13.wait])}-#{b1.wait}" |
| 58 | + end |
| 59 | + |
| 60 | + ab2 = Async do |
| 61 | + a21 = SEMAPHORE_A.async{ a(21) } |
| 62 | + a22 = SEMAPHORE_A.async{ a(22) } |
| 63 | + a23 = SEMAPHORE_A.async{ a(23) } |
| 64 | + b2 = SEMAPHORE_B.async{ b(2) } |
| 65 | + "#{collect_sorted([a21.wait, a22.wait, a23.wait])}-#{b2.wait}" |
| 66 | + end |
| 67 | + |
| 68 | + ab3 = Async do |
| 69 | + a31 = SEMAPHORE_A.async{ a(31) } |
| 70 | + a32 = SEMAPHORE_A.async{ a(32) } |
| 71 | + a33 = SEMAPHORE_A.async{ a(33) } |
| 72 | + b3 = SEMAPHORE_B.async{ b(3) } |
| 73 | + "#{collect_sorted([a31.wait, a32.wait, a33.wait])}-#{b3.wait}" |
| 74 | + end |
| 75 | + |
| 76 | + c123 = Async do |
| 77 | + c1 = SEMAPHORE_C.async{ c(ab1.wait) } |
| 78 | + c2 = SEMAPHORE_C.async{ c(ab2.wait) } |
| 79 | + c3 = SEMAPHORE_C.async{ c(ab3.wait) } |
| 80 | + collect_sorted([c1.wait, c2.wait, c3.wait]) |
| 81 | + end.wait |
| 82 | + |
| 83 | + a(c123) |
| 84 | +end |
76 | 85 |
|
77 | | -puts "FINISHED in #{Time.now - start}s." |
78 | | -puts "RESULT = #{result}" # 0bbe9ecf251ef4131dd43e1600742cfb |
| 86 | +total_time = Time.now - start |
| 87 | +puts "FINISHED in #{total_time}s." |
| 88 | +puts "VALID DURATION: #{total_time < VALID_DURATION}" |
| 89 | +puts "RESULT = #{result}" |
| 90 | +puts "VALID: #{result==VALID_RESULT}" |
0 commit comments