-
Notifications
You must be signed in to change notification settings - Fork 419
Open
Description
In the Ruby implementation:
require 'concurrent'
puts "Thread Count: #{Thread.list.count}"
pool = Concurrent::CachedThreadPool.new( min_threads: 0, max_threads: 5, idletime: 1 )
puts "Thread Count: #{Thread.list.count}"
# we have 1 thread for now
5.times do
pool.post do
puts "Hello from thread #{Thread.current.object_id}"
end
end
# we now have 5
sleep 2
puts "Thread Count: #{Thread.list.count}"
# we still have 5
pool.post do
puts "Hello from thread #{Thread.current.object_id}"
end
sleep 1
puts "Thread Count: #{Thread.list.count}"
# we just issued a prune as a side effect so we have 2
pool.prune_pool
sleep 2
# we need to sleep cause prune_pool is async
puts "Thread Count: #{Thread.list.count}"
# we now have 1 threadCachedThreadPool only spins down threads when you queue work, so if you are done queuing work you need to remember to wait for it to be done and then issue a #prune_pool call
This is technically very tricky cause you need to carry an extra thread for that. The Ruby design should change so threads just wait idle_time for new work and spin down if no new work arrives.
Metadata
Metadata
Assignees
Labels
No labels