concurrent-ruby 1.2.2 → 1.3.1.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile +1 -1
- data/README.md +2 -0
- data/lib/concurrent-ruby/concurrent/array.rb +3 -3
- data/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb +23 -20
- data/lib/concurrent-ruby/concurrent/concurrent_ruby.jar +0 -0
- data/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb +4 -0
- data/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb +4 -7
- data/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb +5 -0
- data/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb +7 -0
- data/lib/concurrent-ruby/concurrent/executor/timer_set.rb +6 -2
- data/lib/concurrent-ruby/concurrent/hash.rb +5 -3
- data/lib/concurrent-ruby/concurrent/map.rb +2 -2
- data/lib/concurrent-ruby/concurrent/promises.rb +33 -23
- data/lib/concurrent-ruby/concurrent/timer_task.rb +59 -9
- data/lib/concurrent-ruby/concurrent/utility/processor_counter.rb +65 -0
- data/lib/concurrent-ruby/concurrent/version.rb +1 -1
- metadata +4 -6
- data/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb +0 -927
- data/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb +0 -81
@@ -11,6 +11,7 @@ module Concurrent
|
|
11
11
|
def initialize
|
12
12
|
@processor_count = Delay.new { compute_processor_count }
|
13
13
|
@physical_processor_count = Delay.new { compute_physical_processor_count }
|
14
|
+
@cpu_quota = Delay.new { compute_cpu_quota }
|
14
15
|
end
|
15
16
|
|
16
17
|
def processor_count
|
@@ -21,6 +22,25 @@ module Concurrent
|
|
21
22
|
@physical_processor_count.value
|
22
23
|
end
|
23
24
|
|
25
|
+
def available_processor_count
|
26
|
+
cpu_count = processor_count.to_f
|
27
|
+
quota = cpu_quota
|
28
|
+
|
29
|
+
return cpu_count if quota.nil?
|
30
|
+
|
31
|
+
# cgroup cpus quotas have no limits, so they can be set to higher than the
|
32
|
+
# real count of cores.
|
33
|
+
if quota > cpu_count
|
34
|
+
cpu_count
|
35
|
+
else
|
36
|
+
quota
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def cpu_quota
|
41
|
+
@cpu_quota.value
|
42
|
+
end
|
43
|
+
|
24
44
|
private
|
25
45
|
|
26
46
|
def compute_processor_count
|
@@ -60,6 +80,24 @@ module Concurrent
|
|
60
80
|
rescue
|
61
81
|
return 1
|
62
82
|
end
|
83
|
+
|
84
|
+
def compute_cpu_quota
|
85
|
+
if RbConfig::CONFIG["target_os"].include?("linux")
|
86
|
+
if File.exist?("/sys/fs/cgroup/cpu.max")
|
87
|
+
# cgroups v2: https://docs.kernel.org/admin-guide/cgroup-v2.html#cpu-interface-files
|
88
|
+
cpu_max = File.read("/sys/fs/cgroup/cpu.max")
|
89
|
+
return nil if cpu_max.start_with?("max ") # no limit
|
90
|
+
max, period = cpu_max.split.map(&:to_f)
|
91
|
+
max / period
|
92
|
+
elsif File.exist?("/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us")
|
93
|
+
# cgroups v1: https://kernel.googlesource.com/pub/scm/linux/kernel/git/glommer/memcg/+/cpu_stat/Documentation/cgroups/cpu.txt
|
94
|
+
max = File.read("/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us").to_i
|
95
|
+
return nil if max == 0
|
96
|
+
period = File.read("/sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us").to_f
|
97
|
+
max / period
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
63
101
|
end
|
64
102
|
end
|
65
103
|
|
@@ -107,4 +145,31 @@ module Concurrent
|
|
107
145
|
def self.physical_processor_count
|
108
146
|
processor_counter.physical_processor_count
|
109
147
|
end
|
148
|
+
|
149
|
+
# Number of processors cores available for process scheduling.
|
150
|
+
# Returns `nil` if there is no #cpu_quota, or a `Float` if the
|
151
|
+
# process is inside a cgroup with a dedicated CPU quota (typically Docker).
|
152
|
+
#
|
153
|
+
# For performance reasons the calculated value will be memoized on the first
|
154
|
+
# call.
|
155
|
+
#
|
156
|
+
# @return [nil, Float] number of available processors
|
157
|
+
def self.available_processor_count
|
158
|
+
processor_counter.available_processor_count
|
159
|
+
end
|
160
|
+
|
161
|
+
# The maximum number of processors cores available for process scheduling.
|
162
|
+
# Returns `nil` if there is no enforced limit, or a `Float` if the
|
163
|
+
# process is inside a cgroup with a dedicated CPU quota (typically Docker).
|
164
|
+
#
|
165
|
+
# Note that nothing prevents setting a CPU quota higher than the actual number of
|
166
|
+
# cores on the system.
|
167
|
+
#
|
168
|
+
# For performance reasons the calculated value will be memoized on the first
|
169
|
+
# call.
|
170
|
+
#
|
171
|
+
# @return [nil, Float] Maximum number of available processors as set by a cgroup CPU quota, or nil if none set
|
172
|
+
def self.cpu_quota
|
173
|
+
processor_counter.cpu_quota
|
174
|
+
end
|
110
175
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concurrent-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jerry D'Antonio
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-05-29 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: |
|
16
16
|
Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.
|
@@ -76,7 +76,6 @@ files:
|
|
76
76
|
- lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb
|
77
77
|
- lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb
|
78
78
|
- lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb
|
79
|
-
- lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb
|
80
79
|
- lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb
|
81
80
|
- lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb
|
82
81
|
- lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb
|
@@ -147,7 +146,6 @@ files:
|
|
147
146
|
- lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb
|
148
147
|
- lib/concurrent-ruby/concurrent/thread_safe/util.rb
|
149
148
|
- lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb
|
150
|
-
- lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb
|
151
149
|
- lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb
|
152
150
|
- lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb
|
153
151
|
- lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb
|
@@ -179,9 +177,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
177
|
version: '2.3'
|
180
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
179
|
requirements:
|
182
|
-
- - "
|
180
|
+
- - ">"
|
183
181
|
- !ruby/object:Gem::Version
|
184
|
-
version:
|
182
|
+
version: 1.3.1
|
185
183
|
requirements: []
|
186
184
|
rubygems_version: 3.3.26
|
187
185
|
signing_key:
|