Async::ContainerSourceAsyncContainerHybrid

class Hybrid

Provides a hybrid multi-process multi-thread container.

Definitions

def run(count: nil, forks: nil, threads: nil, health_check_timeout: nil, **options, &block)

Run multiple instances of the same block in the container.

Signature

parameter count Integer

The number of instances to start.

parameter forks Integer

The number of processes to fork.

parameter threads Integer

the number of threads to start.

parameter health_check_timeout Numeric

The timeout for health checks, in seconds. Passed into the child class Async::Container::Threaded containers.

Implementation

def run(count: nil, forks: nil, threads: nil, health_check_timeout: nil, **options, &block)
	processor_count = Container.processor_count
	count ||= processor_count ** 2
	forks ||= [processor_count, count].min
	threads ||= (count / forks).ceil
	
	forks.times do
		self.spawn(**options) do |instance|
			container = Threaded.new
			
			container.run(count: threads, health_check_timeout: health_check_timeout, **options, &block)
			
			container.wait_until_ready
			instance.ready!
			
			begin
				container.wait
			rescue Interrupt
				# Gracefully interrupt child threads; parent process handles escalation.
				container.interrupt
				retry
			end
		ensure
			container.stop(false)
		end
	end
	
	return self
end