Unyielding (Concurrency Is Hard)
glyph.twistedmatrix.com
glyph.twistedmatrix.com
However, at least when using Python, it's not always an option to only use concurrent code. Many useful libraries rely on blocking APIs and greenlets are more predictable than threads and cheaper than both threads and processes.
Not even Go gets this right: goroutines share memory implicitly! There are few real options: Clojure+core.async, Haskell, Erlang. Python+Twisted or similar would also be an option, but it's annoying to write and means you have to ignore most libraries out there, at which point you might as well use a better language in the first place.
OK... if the state was this bad, I'm willing to go out on a limb and lay the blame on the people writing the code. "Threads are hard" has become somewhat of a truism in the industry but seriously, they're not this hard.
Programming is hard, algebra is hard, heck, plumbing or wiring a building is hard. And yet, competent people who've studied the skills, practiced their craft and are willing to spend time and effort in carefully working through each project, manage to build working, lasting systems in all sorts of complex fields. Concurrency is hard and there's no silver bullet. Let's not pretend the Next Cool Thing will suddenly make all the difficulties disappear.