parallel.cr
Parallel is a shard which provides tools for parallelism similar to how Crystal provides tools for concurrency. It provides an analogue of fibers and channels using processes, and a special type of channel to communicate between processes.
Installation
Add this to your application's shard.yml:
dependencies: parallel: github: RX14/parallel.cr
Usage
In the following example, you would expect to complete the tasks in 3 seconds because it processes 4 jobs at a time. However, currently Crystal can only execute code on a single core at a time, and it will take the full 12 seconds to execute.
lib LibC fun sleep(seconds : UInt) end def do_work(job) LibC.sleep(1) job * 2 end def worker(in_channel, out_channel) loop do job = in_channel.receive result = do_work(job) out_channel.send(result) end end job_channel = Channel(Int32).new results_channel = Channel(Int32).new # spawn 4 workers 4.times do spawn worker(job_channel, results_channel) end spawn do 12.times { |i| job_channel.send i } end time = Time.measure do 12.times { p results_channel.receive } end p time
Simply by requiring "parallel", replacing spawn with pspawn, and Channel with PChan, this simple example will execute in only 3 seconds.
Development
TODO: Write development instructions here
Contributing
- Fork it ( https://github.com/RX14/parallel.cr/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- RX14 RX14 - creator, maintainer