Show HN: Goru, an experimental, Go-inspired concurrency library for Ruby
Hey folks, wanted to show this off and get feedback. Still early&#x2F;experimental but there are quite a few concepts I&#x27;m excited about here. This project came about while writing a program in Go and loving its approach to concurrency. Being a long-time Rubyist I immediately started to think about what similar concepts might look like in Ruby.<p>I set out with two main design constraints:<p>1. Lightweight: I didn&#x27;t want routines to be backed by fibers or threads. Having been involved some in the async project (<a href="https:&#x2F;&#x2F;github.com&#x2F;socketry&#x2F;async">https:&#x2F;&#x2F;github.com&#x2F;socketry&#x2F;async</a>), I had some experience using fibers for concurrency but was curious if they could be avoided.<p>2. Explicitness: Routine behavior must be written to describe exactly how it is to behave. I always felt like concurrent code was hard to fully understand because of the indirection involved. On the spectrum between tedium and magical I wanted to err more on the side of tedium with Goru.<p>Goru routines are just blocks that are called once for every tick of the reactor. It is up to the developer to implement behavior in terms of a state machine, where on each tick the routine takes some action and then updates the state of the routine for the next tick. This fulfills both design constraints:<p>1. Because routines are just blocks, they weigh in at about ~345 bytes of memory overhead.<p>2. Routine behavior is explicit because it is written as a state machine inside the block.<p>Couple more features worth noting:<p>* Goru includes channels for buffered reading&#x2F;writing (similar to channels in Go).<p>* Goru ships with primitives for non-blocking IO to easily build things like http servers.<p>Curious your thoughts!