-
Concurrent Ruby
Modern concurrency tools including agents, futures, promises, thread pools, supervisors, and more. Inspired by Erlang, Clojure, Scala, Go, Java, JavaScript, and classic concurrency patterns.
As I could not find a clear example about how to rescue exceptions from Concurrent::Promises (part of the Concurrent Ruby gem ) I read through the documentation and here are two examples: one that documents success case and one that shows what is happening when there is an error.
-
Scout Monitoring
Performance metrics and, now, Logs Management Monitoring with Scout Monitoring. Get early access to Scout Monitoring's NEW Ruby logging feature [beta] by signing up now. Start for free and enable logs to get better insights into your Rails apps.
-
require 'bundler/inline' gemfile do ruby "3.0.1" source 'https://rubygems.org' gem "concurrent-ruby" end require "concurrent" require "pp" # Just a simple class that needs to execute something class Load def initialize(id) @id = id end def work exception = [MyException, SecondException].sample raise exception.send(:new) end end class MyException < Exception ; end class SecondException < Exception ; end class ParallelExecution def call # Using here Concurrent::Array to be thread safe exceptions = Concurrent::Array.new promises = [] 10.times do |t| promises << Concurrent::Promises.future { Load.new(t).work }.rescue { exceptions.push(_1) } end # Calling .value on each job to wait for its execution values = Concurrent::Promises.zip(*promises).value # Raising exceptions if any of the jobs were returning an exception if exceptions.length > 0 count_my_exception = exceptions.count { _1.instance_of?(MyException) } count_second_exception = exceptions.count { _1.instance_of?(SecondException) } puts "MyException generated #{count_my_exception}" puts "SecondException generated #{count_second_exception}" end end end ParallelExecution.new.call