37
37
38
38
### Supported Ruby versions
39
39
40
- MRI 1.9.3, 2.0, 2.1, JRuby (1.9 mode), and Rubinius 2.x are supported.
41
- Although native code is used for performance optimizations on some platforms, all functionality
42
- is available in pure Ruby. This gem should be fully compatible with any interpreter that is
43
- compliant with Ruby 1.9.3 or newer.
40
+ MRI 1.9.3, 2.0, 2.1, 2.2, JRuby (1.9 mode), and Rubinius 2.x are supported.
41
+ This gem should be fully compatible with any interpreter that is compliant with Ruby 1.9.3 or newer.
44
42
45
43
## Features & Documentation
46
44
@@ -62,6 +60,7 @@ This library contains a variety of concurrency abstractions at high and low leve
62
60
* [ Promise] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Promise.html ) : Similar to Futures, with more features.
63
61
* [ ScheduledTask] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ScheduledTask.html ) : Like a Future scheduled for a specific future time.
64
62
* [ TimerTask] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TimerTask.html ) : A Thread that periodically wakes up to perform work at regular intervals.
63
+ * [ Channel] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Channel.html ) : Communicating Sequential Processes (CSP).
65
64
66
65
### Java-inspired ThreadPools and other executors
67
66
@@ -98,28 +97,45 @@ Lower-level abstractions mainly used as building blocks.
98
97
* [ thread-local variables] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ThreadLocalVar.html )
99
98
* [ software transactional memory] ( http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TVar.html ) (TVar)
100
99
101
- ## Installing and Building
100
+ ## Usage
102
101
103
- This gem includes several platform-specific optimizations. To reduce the possibility of
104
- compilation errors, we provide pre-compiled gem packages for several platforms as well
105
- as a pure-Ruby build. Installing the gem should be no different than installing any other
106
- Rubygems-hosted gem. Rubygems will automatically detect your platform and install the
107
- appropriate pre-compiled build. You should never see Rubygems attempt to compile the gem
108
- on installation. Additionally, to ensure compatability with the largest possible number
109
- of Ruby interpreters, the C extensions will * never* load under any Ruby other than MRI,
110
- even when installed.
102
+ All abstractions within this gem can be loaded simply by requiring it:
111
103
112
- The following gem builds will be built at every release:
104
+ ``` ruby
105
+ require ' concurrent'
106
+ ```
107
+
108
+ To reduce the amount of code loaded at runtime, subsets of this gem can be required:
113
109
114
- * concurrent-ruby-x.y.z.gem (pure Ruby)
115
- * concurrent-ruby-x.y.z-java.gem (JRuby)
116
- * concurrent-ruby-x.y.z-x86-linux.gem (Linux 32-bit)
117
- * concurrent-ruby-x.y.z-x86_64-linux.gem (Linux 64-bit)
118
- * concurrent-ruby-x.y.z-x86-mingw32.gem (Windows 32-bit)
119
- * concurrent-ruby-x.y.z-x64-mingw32.gem (Windows 64-bit)
120
- * concurrent-ruby-x.y.z-x86-solaris-2.11.gem (Solaris)
110
+ ``` ruby
111
+ require ' concurrent' # everything
112
+
113
+ # groups
114
+
115
+ require ' concurrent/actor' # Concurrent::Actor and supporting code
116
+ require ' concurrent/atomics' # atomic and thread synchronization classes
117
+ require ' concurrent/channels' # Concurrent::Channel and supporting code
118
+ require ' concurrent/executors' # Thread pools and other executors
119
+ require ' concurrent/utilities' # utility methods such as processor count and timers
120
+
121
+ # individual abstractions
122
+
123
+ require ' concurrent/agent' # Concurrent::Agent
124
+ require ' concurrent/async' # Concurrent::Async
125
+ require ' concurrent/atomic' # Concurrent::Atomic (formerly the `atomic` gem)
126
+ require ' concurrent/dataflow' # Concurrent::dataflow
127
+ require ' concurrent/delay' # Concurrent::Delay
128
+ require ' concurrent/exchanger' # Concurrent::Exchanger
129
+ require ' concurrent/future' # Concurrent::Future
130
+ require ' concurrent/ivar' # Concurrent::IVar
131
+ require ' concurrent/mvar' # Concurrent::MVar
132
+ require ' concurrent/promise' # Concurrent::Promise
133
+ require ' concurrent/scheduled_task' # Concurrent::ScheduledTask
134
+ require ' concurrent/timer_task' # Concurrent::TimerTask
135
+ require ' concurrent/tvar' # Concurrent::TVar
136
+ ```
121
137
122
- ### Installing
138
+ ## Installation
123
139
124
140
``` shell
125
141
gem install concurrent-ruby
@@ -133,31 +149,64 @@ gem 'concurrent-ruby'
133
149
134
150
and run ` bundle install ` from your shell.
135
151
136
- ### Building
152
+ ### C Extensions for MRI
137
153
138
- Because we provide pre-compiled gem builds, users should never need to build the gem manually .
139
- The build process for this gem is completely automated using open source tools. All of
140
- the automation components are available in the [ ruby-concurrency/rake-compiler-dev-box ] ( https://github.com/ruby-concurrency/rake-compiler-dev-box )
141
- GitHub repository.
154
+ Potential performance improvements may be achieved under MRI by installing optional C extensions .
155
+ To minimize installation errors the C extensions are available in the ` concurrent-ruby-ext ` extension
156
+ gem. The extension gem lists ` concurrent-ruby ` as a dependency so it is not necessary to install both.
157
+ Simply install the extension gen:
142
158
143
- This gem will compile native C code under MRI and native Java code under JRuby. It is
144
- also possible to build a pure-Ruby version. All builds have identical functionality.
145
- The only difference is performance. Additionally, pure-Ruby classes are always available,
146
- even when using the native optimizations. Please see the [ documentation] ( http://ruby-concurrency.github.io/concurrent-ruby/ )
147
- for more details.
159
+ ``` ruby
160
+ gem install concurrent- ruby- ext
161
+ ```
148
162
149
- To build and package the gem using MRI or JRuby, install the necessary build dependencies and run :
163
+ or add the following line to Gemfile :
150
164
151
- ``` shell
152
- bundle exec rake compile
153
- bundle exec rake build
165
+ ``` ruby
166
+ gem ' concurrent-ruby-ext'
167
+ ```
168
+
169
+ and run ` bundle install ` from your shell.
170
+
171
+ In code it is only necessary to
172
+
173
+ ``` ruby
174
+ require ' concurrent'
154
175
```
155
176
156
- To build and package a pure-Ruby gem, on * any * platform and interpreter
157
- (including MRI and JRuby), run:
177
+ The ` concurrent-ruby ` gem will automatically detect the presence of the ` concurrent-ruby-ext ` gem
178
+ and load the appropriate C extensions.
158
179
159
- ``` shell
160
- BUILD_PURE_RUBY=' true' bundle exec rake build
180
+ #### Note For gem developers
181
+
182
+ No gems should depend on ` concurrent-ruby-ext ` . Doing so will force C extensions on your users.
183
+ The best practice is to depend on ` concurrent-ruby ` and let users to decide if they want C extensions.
184
+
185
+ ### Building
186
+
187
+ All published versions of this gem (core, extension, and several platform-specific packages) are compiled,
188
+ packaged, tested, and published using an open, [ automated process] ( https://github.com/ruby-concurrency/rake-compiler-dev-box ) .
189
+ This process can also be used to create pre-compiled binaries of the extension gem for virtally
190
+ any platform. * Documentation is forthcoming...*
191
+
192
+ ```
193
+ *MRI only*
194
+ rake build:native # Build concurrent-ruby-ext-<version>-<platform>.gem into the pkg directory
195
+ rake compile:extension # Compile extension
196
+
197
+ *JRuby only*
198
+ rake build # Build JRuby-specific core gem (alias for `build:core`)
199
+ rake build:core # Build concurrent-ruby-<version>-java.gem into the pkg directory
200
+
201
+ *All except JRuby*
202
+ rake build # Build core and extension gems
203
+ rake build:core # Build concurrent-ruby-<version>.gem into the pkg directory
204
+ rake build:ext # Build concurrent-ruby-ext-<version>.gem into the pkg directory
205
+
206
+ *All*
207
+ rake clean # Remove any temporary products
208
+ rake clobber # Remove any generated file
209
+ rake compile # Compile all the extensions
161
210
```
162
211
163
212
## Maintainers
@@ -167,6 +216,7 @@ BUILD_PURE_RUBY='true' bundle exec rake build
167
216
* [ Chris Seaton] ( https://github.com/chrisseaton )
168
217
* [ Lucas Allan] ( https://github.com/lucasallan )
169
218
* [ Petr Chalupa] ( https://github.com/pitr-ch )
219
+ * [ Paweł Obrok] ( https://github.com/obrok )
170
220
171
221
### Contributing
172
222
0 commit comments