@@ -47,17 +47,17 @@ Class.new do
47
47
resolvable_event
48
48
end
49
49
end .new .a_method
50
- # => <#Concurrent::Promises::ResolvableEvent:0x7fa95ca52488 pending>
50
+ # => <#Concurrent::Promises::ResolvableEvent:0x7fb4ba3e8c78 pending>
51
51
52
52
Module .new { extend Concurrent ::Promises ::FactoryMethods }.resolvable_event
53
- # => <#Concurrent::Promises::ResolvableEvent:0x7fa95ca4a9e0 pending>
53
+ # => <#Concurrent::Promises::ResolvableEvent:0x7fb4ba3e2850 pending>
54
54
```
55
55
56
56
The module is already extended into {Concurrent::Promises} for convenience.
57
57
58
58
``` ruby
59
59
Concurrent ::Promises .resolvable_event
60
- # => <#Concurrent::Promises::ResolvableEvent:0x7fa95ca48708 pending>
60
+ # => <#Concurrent::Promises::ResolvableEvent:0x7fb4ba3e08e8 pending>
61
61
```
62
62
63
63
For this guide we introduce a shortcut in ` main ` so we can call the factory
@@ -66,7 +66,7 @@ methods in following examples by using `Promisses` directly.
66
66
``` ruby
67
67
Promises = Concurrent ::Promises
68
68
Promises .resolvable_event
69
- # => <#Concurrent::Promises::ResolvableEvent:0x7fa95ca41d18 pending>
69
+ # => <#Concurrent::Promises::ResolvableEvent:0x7fb4ba3d8be8 pending>
70
70
```
71
71
72
72
## Asynchronous task
@@ -82,7 +82,7 @@ future = Promises.future(0.1) do |duration|
82
82
sleep duration
83
83
:result
84
84
end
85
- # => <#Concurrent::Promises::Future:0x7fa95b3eb410 pending>
85
+ # => <#Concurrent::Promises::Future:0x7fb4ba3c8248 pending>
86
86
```
87
87
88
88
Asks if the future is resolved, here it will be still in the middle of the
@@ -103,7 +103,7 @@ If the task fails we talk about the future being rejected.
103
103
104
104
``` ruby
105
105
future = Promises .future { raise ' Boom' }
106
- # => <#Concurrent::Promises::Future:0x7fa95b3dae58 pending>
106
+ # => <#Concurrent::Promises::Future:0x7fb4ba3b1bd8 pending>
107
107
```
108
108
109
109
There is no result, the future was rejected with a reason.
@@ -198,20 +198,20 @@ through evaluation as follows.
198
198
199
199
``` ruby
200
200
Promises .future { :value }
201
- # => <#Concurrent::Promises::Future:0x7fa95b89f510 pending>
201
+ # => <#Concurrent::Promises::Future:0x7fb4ba322230 pending>
202
202
```
203
203
204
204
Instead it can be created directly.
205
205
206
206
``` ruby
207
207
Promises .fulfilled_future(:value )
208
- # => <#Concurrent::Promises::Future:0x7fa95b390bc8 fulfilled>
208
+ # => <#Concurrent::Promises::Future:0x7fb4ba31a648 fulfilled>
209
209
Promises .rejected_future(StandardError .new (' Ups' ))
210
- # => <#Concurrent::Promises::Future:0x7fa95b38b628 rejected>
210
+ # => <#Concurrent::Promises::Future:0x7fb4ba319298 rejected>
211
211
Promises .resolved_future(true , :value , nil )
212
- # => <#Concurrent::Promises::Future:0x7fa95b38a688 fulfilled>
212
+ # => <#Concurrent::Promises::Future:0x7fb4ba3133e8 fulfilled>
213
213
Promises .resolved_future(false , nil , StandardError .new (' Ups' ))
214
- # => <#Concurrent::Promises::Future:0x7fa95b3892b0 rejected>
214
+ # => <#Concurrent::Promises::Future:0x7fb4ba311700 rejected>
215
215
```
216
216
217
217
## Chaining
@@ -252,9 +252,9 @@ do_stuff arg }`) is **required**, both following examples may break.
252
252
``` ruby
253
253
arg = 1 # => 1
254
254
Thread .new { do_stuff arg }
255
- # => #<Thread:0x007fa95b322fd8 @promises.in.md:193 run>
255
+ # => #<Thread:0x007fb4ba2a2710 @promises.in.md:193 run>
256
256
Promises .future { do_stuff arg }
257
- # => <#Concurrent::Promises::Future:0x7fa95b321020 pending>
257
+ # => <#Concurrent::Promises::Future:0x7fb4ba2a0dc0 pending>
258
258
```
259
259
260
260
## Branching, and zipping
@@ -316,7 +316,7 @@ Promises.
316
316
result
317
317
# => [false,
318
318
# nil,
319
- # #<NoMethodError: undefined method `succ' for #<Object:0x007fa95ca28368 >>]
319
+ # #<NoMethodError: undefined method `succ' for #<Object:0x007fb4ba2310d8 >>]
320
320
```
321
321
322
322
As ` then ` chained tasks execute only on fulfilled futures, there is a ` rescue `
@@ -364,7 +364,7 @@ Zip is rejected if any of the zipped futures is.
364
364
rejected_zip = Promises .zip(
365
365
Promises .fulfilled_future(1 ),
366
366
Promises .rejected_future(StandardError .new (' Ups' )))
367
- # => <#Concurrent::Promises::Future:0x7fa95b2428e8 rejected>
367
+ # => <#Concurrent::Promises::Future:0x7fb4bc332390 rejected>
368
368
rejected_zip.result
369
369
# => [false, [1, nil], [nil, #<StandardError: Ups>]]
370
370
rejected_zip.
@@ -379,11 +379,11 @@ requiring resolution.
379
379
380
380
``` ruby
381
381
future = Promises .delay { sleep 0.1 ; ' lazy' }
382
- # => <#Concurrent::Promises::Future:0x7fa95b229eb0 pending>
382
+ # => <#Concurrent::Promises::Future:0x7fb4bc3188f0 pending>
383
383
sleep 0.1
384
384
future.resolved? # => false
385
385
future.touch
386
- # => <#Concurrent::Promises::Future:0x7fa95b229eb0 pending>
386
+ # => <#Concurrent::Promises::Future:0x7fb4bc3188f0 pending>
387
387
sleep 0.2
388
388
future.resolved? # => true
389
389
```
@@ -460,7 +460,7 @@ Schedule task to be executed in 0.1 seconds.
460
460
461
461
``` ruby
462
462
scheduled = Promises .schedule(0.1 ) { 1 }
463
- # => <#Concurrent::Promises::Future:0x7fa95c9b1ce0 pending>
463
+ # => <#Concurrent::Promises::Future:0x7fb4bc288958 pending>
464
464
scheduled.resolved? # => false
465
465
```
466
466
@@ -485,7 +485,7 @@ Time can be used as well.
485
485
486
486
``` ruby
487
487
Promises .schedule(Time .now + 10 ) { :val }
488
- # => <#Concurrent::Promises::Future:0x7fa95c972ae0 pending>
488
+ # => <#Concurrent::Promises::Future:0x7fb4bc252330 pending>
489
489
```
490
490
491
491
## Resolvable Future and Event:
@@ -497,15 +497,15 @@ Sometimes it is required to resolve a future externally, in these cases
497
497
498
498
``` ruby
499
499
future = Promises .resolvable_future
500
- # => <#Concurrent::Promises::ResolvableFuture:0x7fa95c970e98 pending>
500
+ # => <#Concurrent::Promises::ResolvableFuture:0x7fb4bc250620 pending>
501
501
```
502
502
503
503
The thread will be blocked until the future is resolved
504
504
505
505
``` ruby
506
506
thread = Thread .new { future.value }
507
507
future.fulfill 1
508
- # => <#Concurrent::Promises::ResolvableFuture:0x7fa95c970e98 fulfilled>
508
+ # => <#Concurrent::Promises::ResolvableFuture:0x7fb4bc250620 fulfilled>
509
509
thread.value # => 1
510
510
```
511
511
@@ -522,9 +522,9 @@ future.fulfill 2, false # => false
522
522
## Callbacks
523
523
524
524
``` ruby
525
- queue = Queue .new # => #<Thread::Queue:0x007fa95e0565b8 >
525
+ queue = Queue .new # => #<Thread::Queue:0x007fb4bb9d5e78 >
526
526
future = Promises .delay { 1 + 1 }
527
- # => <#Concurrent::Promises::Future:0x7fa95e0547b8 pending>
527
+ # => <#Concurrent::Promises::Future:0x7fb4bb9d4730 pending>
528
528
529
529
future.on_fulfillment { queue << 1 } # evaluated asynchronously
530
530
future.on_fulfillment! { queue << 2 } # evaluated on resolving thread
@@ -547,7 +547,7 @@ and `:io` for blocking and long tasks.
547
547
``` ruby
548
548
Promises .future_on(:fast ) { 2 }.
549
549
then_on(:io ) { File .read __FILE__ }.
550
- value.size # => 18760
550
+ value.size # => 18764
551
551
```
552
552
553
553
# Interoperability
@@ -560,7 +560,7 @@ Create an actor which takes received numbers and returns the number squared.
560
560
actor = Concurrent ::Actor ::Utils ::AdHoc .spawn :square do
561
561
-> v { v ** 2 }
562
562
end
563
- # => #<Concurrent::Actor::Reference:0x7fa95c919e90 /square (Concurrent::Actor::Utils::AdHoc)>
563
+ # => #<Concurrent::Actor::Reference:0x7fb4bb986670 /square (Concurrent::Actor::Utils::AdHoc)>
564
564
```
565
565
566
566
Send result of ` 1+1 ` to the actor, and add 2 to the result send back from the
@@ -592,17 +592,17 @@ actor.ask(2).then(&:succ).value! # => 5
592
592
593
593
``` ruby
594
594
Promises .future { do_stuff }
595
- # => <#Concurrent::Promises::Future:0x7fa95b1eb8e0 pending>
595
+ # => <#Concurrent::Promises::Future:0x7fb4bb947740 pending>
596
596
```
597
597
598
598
## Parallel background processing
599
599
600
600
``` ruby
601
601
tasks = 4 .times.map { |i | Promises .future(i) { |i | i* 2 } }
602
- # => [<#Concurrent::Promises::Future:0x7fa95b1e2e48 pending>,
603
- # <#Concurrent::Promises::Future:0x7fa95b1e1f70 pending>,
604
- # <#Concurrent::Promises::Future:0x7fa95b1e1188 pending>,
605
- # <#Concurrent::Promises::Future:0x7fa95b1e0198 pending>]
602
+ # => [<#Concurrent::Promises::Future:0x7fb4bb93f090 pending>,
603
+ # <#Concurrent::Promises::Future:0x7fb4bb93e488 pending>,
604
+ # <#Concurrent::Promises::Future:0x7fb4bb93d6f0 pending>,
605
+ # <#Concurrent::Promises::Future:0x7fb4bb93c778 pending>]
606
606
Promises .zip(* tasks).value! # => [0, 2, 4, 6]
607
607
```
608
608
@@ -655,11 +655,11 @@ Create the computer actor and send it 3 jobs.
655
655
656
656
``` ruby
657
657
computer = Concurrent ::Actor .spawn Computer , :computer
658
- # => #<Concurrent::Actor::Reference:0x7fa95a3f2c48 /computer (Computer)>
658
+ # => #<Concurrent::Actor::Reference:0x7fb4ba9b3388 /computer (Computer)>
659
659
results = 3 .times.map { computer.ask [:run , -> { sleep 0.1 ; :result }] }
660
- # => [<#Concurrent::Promises::Future:0x7fa95a3d30c8 pending>,
661
- # <#Concurrent::Promises::Future:0x7fa95a3d0e40 pending>,
662
- # <#Concurrent::Promises::Future:0x7fa95a3cb760 pending>]
660
+ # => [<#Concurrent::Promises::Future:0x7fb4ba990450 pending>,
661
+ # <#Concurrent::Promises::Future:0x7fb4ba9897e0 pending>,
662
+ # <#Concurrent::Promises::Future:0x7fb4ba988318 pending>]
663
663
computer.ask(:status ).value! # => {:running_jobs=>3}
664
664
results.map(& :value! ) # => [:result, :result, :result]
665
665
```
@@ -706,8 +706,8 @@ Lets have two processes which will count until cancelled.
706
706
707
707
``` ruby
708
708
source, token = Concurrent ::Cancellation .create
709
- # => [<#Concurrent::Cancellation:0x7fa95a223840 canceled:false>,
710
- # <#Concurrent::Cancellation::Token:0x7fa95a2222b0 canceled:false>]
709
+ # => [<#Concurrent::Cancellation:0x7fb4ba1bc300 canceled:false>,
710
+ # <#Concurrent::Cancellation::Token:0x7fb4ba1b7670 canceled:false>]
711
711
712
712
count_until_cancelled = -> token, count do
713
713
if token.canceled?
@@ -720,12 +720,12 @@ end
720
720
futures = Array .new (2 ) do
721
721
Promises .future(token, 0 , & count_until_cancelled).run
722
722
end
723
- # => [<#Concurrent::Promises::Future:0x7fa95b1b8a08 pending>,
724
- # <#Concurrent::Promises::Future:0x7fa95b1aa110 pending>]
723
+ # => [<#Concurrent::Promises::Future:0x7fb4ba13d578 pending>,
724
+ # <#Concurrent::Promises::Future:0x7fb4ba13c308 pending>]
725
725
726
726
sleep 0.01
727
727
source.cancel # => true
728
- futures.map(& :value! ) # => [65, 66 ]
728
+ futures.map(& :value! ) # => [35, 34 ]
729
729
```
730
730
731
731
Cancellation can also be used as event or future to log or plan re-execution.
@@ -744,8 +744,8 @@ tasks share a cancellation, when one of them fails it cancels the others.
744
744
745
745
``` ruby
746
746
source, token = Concurrent ::Cancellation .create
747
- # => [<#Concurrent::Cancellation:0x7fa95c9c8c60 canceled:false>,
748
- # <#Concurrent::Cancellation::Token:0x7fa95c9c8710 canceled:false>]
747
+ # => [<#Concurrent::Cancellation:0x7fb4ba053130 canceled:false>,
748
+ # <#Concurrent::Cancellation::Token:0x7fb4ba051fb0 canceled:false>]
749
749
tasks = 4 .times.map do |i |
750
750
Promises .future(source, token, i) do |source , token , i |
751
751
count = 0
@@ -761,22 +761,22 @@ tasks = 4.times.map do |i|
761
761
end
762
762
end
763
763
end
764
- # => [<#Concurrent::Promises::Future:0x7fa95c9a1818 pending>,
765
- # <#Concurrent::Promises::Future:0x7fa95c9a0aa8 pending>,
766
- # <#Concurrent::Promises::Future:0x7fa95c98bb30 pending>,
767
- # <#Concurrent::Promises::Future:0x7fa95c98aed8 pending>]
764
+ # => [<#Concurrent::Promises::Future:0x7fb4ba03b0f8 pending>,
765
+ # <#Concurrent::Promises::Future:0x7fb4ba0397a8 pending>,
766
+ # <#Concurrent::Promises::Future:0x7fb4ba038308 pending>,
767
+ # <#Concurrent::Promises::Future:0x7fb4ba0332b8 pending>]
768
768
Promises .zip(* tasks).result
769
769
# => [false,
770
- # [nil, :cancelled, :cancelled, nil],
771
- # [#<RuntimeError: random error>, nil, nil, #<RuntimeError: random error>]]
770
+ # [:cancelled, :cancelled, nil, :cancelled ],
771
+ # [nil, nil, #<RuntimeError: random error>, nil ]]
772
772
```
773
773
774
774
Without the randomly failing part it produces following.
775
775
776
776
``` ruby
777
777
source, token = Concurrent ::Cancellation .create
778
- # => [<#Concurrent::Cancellation:0x7fa95ca897d0 canceled:false>,
779
- # <#Concurrent::Cancellation::Token:0x7fa95ca83c68 canceled:false>]
778
+ # => [<#Concurrent::Cancellation:0x7fb4bb9ee0b8 canceled:false>,
779
+ # <#Concurrent::Cancellation::Token:0x7fb4bb9ed9d8 canceled:false>]
780
780
tasks = 4 .times.map do |i |
781
781
Promises .future(source, token, i) do |source , token , i |
782
782
count = 0
@@ -884,13 +884,13 @@ DB_INTERNAL_POOL = Concurrent::Array.new data
884
884
# "********",
885
885
# "*********"]
886
886
887
- max_tree = Promises ::Throttle .new 3
888
- # => <#Concurrent::Promises:: Throttle:0x7fa95b2d0cb0 limit:3 can_run:3>
887
+ max_tree = Concurrent ::Throttle .new 3
888
+ # => <#Concurrent::Throttle:0x7fb4ba2f22d8 limit:3 can_run:3>
889
889
890
890
futures = 11 .times.map do |i |
891
891
max_tree.
892
892
# throttled tasks, at most 3 simultaneous calls of [] on the database
893
- then_throttled { DB_INTERNAL_POOL [i] }.
893
+ throttled_future { DB_INTERNAL_POOL [i] }.
894
894
# un-throttled tasks, unlimited concurrency
895
895
then { |starts | starts.size }.
896
896
rescue { |reason | reason.message }
@@ -927,7 +927,7 @@ def schedule_job(interval, &job)
927
927
end
928
928
end
929
929
930
- queue = Queue .new # => #<Thread::Queue:0x007fa95e08d838 >
930
+ queue = Queue .new # => #<Thread::Queue:0x007fb4ba201568 >
931
931
count = 0 # => 0
932
932
interval = 0.05 # small just not to delay execution of this example
933
933
0 commit comments